perm filename DFTP.MAC[NET,MRC]21 blob sn#318459 filedate 1977-11-23 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00056 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00006 00002	Switches, definitions, etc.
C00009 00003	Macros
C00014 00004	SAIL definitions
C00017 00005	Main Program
C00019 00006	Terminal Input Dispatch Tables
C00021 00007	Top level commands
C00031 00008	Path input and translation
C00034 00009	 PATH INPUT
C00044 00010	 P$PP -- PROCESS PATH (NODES AND FILES)
C00047 00011	 CONVERT PATH FROM DFTP FORM TO DATACOMPUTER FORM
C00050 00012	 LOCAL FILE NAME PREPARATION
C00051 00013	Datacomputer interface routines
C00054 00014	 DCHA -- CHANGE PRIVILEGES (DELETE AND ADD)
C00057 00015	 DCON -- CONNECT (VERIFY CONTEXT)
C00058 00016	 DDEL -- DELETE FILES
C00060 00017	 DDIR -- FILE DIRECTORY
C00063 00018	 DEXA -- EXAMINE (LIST FILES TO TERMINAL)
C00067 00019	 DEXP -- EXPUNGE
C00070 00020	 DGET -- GET-RETRIEVE
C00073 00021	 DLIS -- NODE DIRECTORY
C00079 00022	 DPUT -- PUT-STORE
C00083 00023	 DREM -- DELETE NODES
C00084 00024	 DREN -- RENUMBER FILES
C00087 00025	 DUND -- UNDELETE
C00089 00026	 D$INIT -- INITIALIZE DATACOMPUTER SESSION
C00093 00027	 D$CON -- CONNECT
C00094 00028	 D$OPEN -- OPEN PROPER <FILES> IN PROPER MODE
C00097 00029	 D$VER -- PRODUCE PROPER VERSION NUMBER
C00103 00030	 D$VEX -- VERIFY THAT VERSION EXISTS
C00105 00031	 D$WITH -- GENERATE A QUALIFIED WITH CLAUSE (CONSIDER *'S)
C00107 00032	 NETSUM -- NETWORK CHECKSUM VERIFICATION
C00109 00033	 RENDER -- REQUEST ENDER (ASSUMES INITIAL RENLIN)
C00113 00034	 TAIN -- TERMINAL AUTHORIZATION INPUT
C00114 00035	 TERMINAL COMMAND INPUT ROUTINE
C00121 00036	 TERMINAL STRING INPUT
C00123 00037	 TERMINAL NUMBER INPUT
C00125 00038	 DCNIN -- DATACOMPUTER NUMBER INPUT
C00126 00039	 $NOUT$ -- INTEGER OUTPUT
C00127 00040	 GETFIL -- GET-RETRIEVE FILE INFORMATION
C00131 00041	 PUTFIL -- PUT-STORE FILE INFORMATION
C00134 00042	 EXAFIL -- EXAMINE FILE... READ AND LIST TO TERMINAL
C00137 00043	 ICP -- CONNECT TO DC
C00142 00044	 NETOI -- NETWORK OPEN INPUT (DATA)
C00144 00045	 NETMSG -- HANDLE PENDING MESSAGES
C00146 00046	 NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
C00147 00047	 NETWORK UTILITY -- MESSAGE INPUT
C00150 00048	 LOCOI -- LOCAL OPEN INPUT (FILE)
C00153 00049	 LOCFFI -- LOCAL FIRST FILE FOR INPUT
C00157 00050	 LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
C00158 00051	 LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
C00160 00052	 LUTDS -- LOCAL UTILITY: DIRECTORY SCAN
C00162 00053	 LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
C00164 00054	 LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
C00167 00055	 OOPS -- THE IMPOSSIBLE HAS HAPPENED
C00169 00056	Data area
C00172 ENDMK
C⊗;
SUBTTL Switches, definitions, etc.
TITLE DFTP  Datacomputer File Transfer Program

; Bugs/Gripes to Bug-DFTP at MIT-AI, which mails to all interested parties.

IFNDEF F.PCAP,<F.PCAP==0>	; 0 IF PRIVILEGED CAPABILITIES UNRESTRICTED

IF1,<PRINTX DFTP...>
IF2,<PRINTX ...is halfway>

; REGISTER DEFINITIONS

	R1==1
	R2==2
	R3==3
	R4==4
	R5==5
	R6==6
	R7==7
	R10==10
	R11==11
	R12==12
	R13==13
	R14==14
	R15==15
	R16==16
	R17==17

;	(SCRATCH REGISTERS)
	X1==1
	X2==2
	X3==3
	X4==4

;	(COMMONLY USED REGISTERS)
	IO==R5
	BP==R6
	FLAG==R15
	UTIL==R16
	STAK==R17

;	(TERMINAL COMMAND INPUT (RECOGNIZER) REGISTERS)
	TCIO==R2		; IO(REGISTER)
	TCIBP==R3		; B(YTE)P(OINTER)
	TCIACB==R4		; A(DDRESSOF)C(ONTROL)B(LOCK)
	TCITLP==R5		; T(RACE)L(IST)P(OINTER)
	TCITCC==R6		; T(RACE)C(OMMAND)C(OUNTER)
	TCIPBP==R7		; P(ARALLEL)B(YTE)P(OINTER)
	TCIPCC==R10		; P(ARALLEL)C(HARACTER)C(OUNTER)
	TCISBP==R11		; S(ERIAL)B(YTE)P(OINTER)
	TCISCC==R12		; S(ERIAL)C(HARACTER)C(OUNTER)
	TCIMAC==R13		; MA(TCHES--)C(OMMANDS)
	TCIMAN==R14		; MA(TCHES--)N(ULLCHARACTER)

IFN 0,<	;.XCREF is for the "@" listing program and should be ignored by MACRO-10
	.XCREF R1,R2,R3,R4,R5,R6,R7,R10,R11,R12,R13,R14,R15,R16,R17
	.XCREF X1,X2,X3,X4,IO,BP,FLAG,UTIL,STAK
>;IFN 0

	DCHOST==37
	DCSOKT==203

	DEFALO==12

	SIZBLK==200
	SIZPAG==1000

	LBSIZE==100
	SBSIZE==20

	LHOST==13
SUBTTL Macros

	SALL

DEFINE	BEGINR(SAVLST,%RETN)
<	..SAVL==0
	..SAVC==0
	IFIDN <SAVLST><ALL>,<..SAVL==77777>
	IFDIF <SAVLST><ALL>,<
		IRP SAVLST,<
			IFG <SAVLST>-20,<!!
				PRINTX SAVLST NOT A REGISTER>
			IFLE <SAVLST>-20,<
				IFN ..SAVL&1←SAVLST,<!!
					PRINTX SAVLST SAVED TWICE>
				..SAVL==..SAVL!1←SAVLST
				..SAVC==..SAVC+1>>>
	IFN ..SAVL,<
		..REG==17
		REPEAT 20,<
			IFN ..SAVL&1←..REG,<PUSH STAK,..REG>
			..REG==..REG-1>>
	DEFINE	.%RETN <%RETN>	; UNIQUE LOCATION FOR RETURN AND ENDR
	DEFINE	.%RETL <%RETN':!>
	..SFLG==0		; LARGEST SKIP RETURN
>

; IF RETURN CAN'T BE POPJ, THEN IT ASSEMBLES AS JRST TO ENDR CODE
;   JRST TO .%RETN FOR NOSKIP RETURN, .%RETN-N FOR SKIP RETURN
;   ..SFLG SIGNALS THAT SKIP CODE MUST BE ASSEMBLED IN ENDR
DEFINE	RETURN(SK,N)
<<IFB <SK>,<<IFE ..SAVC,<POPJ STAK,.%RETN>>+<IFN ..SAVC,<JRST .%RETN>>>>+<IFIDN <SK><SKIP>,<<IFG N-..SFLG,<..SFLG==N>>*0+<JRST .%RETN-N>>>>

; RETURN FOR USE WITH CONDITIONAL JUMPS
DEFINE	RETN(N)
<<IFB <N>,<<IFE ..SAVC,<.%RETN>>+<IFN ..SAVC,<.%RETN>>>>+<IFNB <N>,<<IFG N-..SFLG,<..SFLG==N>>*0+<.%RETN-N>>>>

; ENDR DECRIMENTS STAK, RESTORES REGS, RETURNS (POSSIBLY SKIPPING)
DEFINE	ENDR(SK,N)
<	IFB <SK>,<..N==0>
	IFIDN <SK><SKIP>,<..N==N
		IFG <..N-..SFLG>,<..SFLG==..N>>
	IFN <..SFLG>,<IFN <..N-..SFLG>,<JRST .%RETN-..N>
		REPEAT ..SFLG,<
			AOS -..SAVC(STAK)>>
	.%RETL
	..REG==0
	REPEAT 20,<
		IFN ..SAVL&1←..REG,<POP STAK,..REG
			..SAVL==..SAVL-1←..REG>
		..REG==..REG+1>
	POPJ STAK,>

DEFINE	CALLR(ROUTIN)
<	PUSHJ STAK,ROUTIN>


DEFINE	TAIN(MSG)
<	HRRZI	X1,MSG
	CALLR	$TAIN$>

DEFINE	TCIN(CLIST,RSTR)
<	MOVE	TCIO,[RSTR,,CLIST]
	CALLR	$TCIN$>

DEFINE	TSIN(BUFFER,BUFS,MSG,NOECHO)
<	MOVE	IO,[BUFFER,,<5*BUFS>-1]
	IFB <NOECHO>,< HRRZI	UTIL,MSG>
	IFNB <NOECHO>,< HRROI	UTIL,MSG>
	CALLR	$TSIN$>

DEFINE	TNIN(MSG,RADIX)
<	IFB <RADIX>,< MOVE	IO,[MSG,,↑D10]>
	IFNB <RADIX>,< MOVE	IO,[MSG,,RADIX]>
	CALLR	$TNIN$>

DEFINE	TNOUT(REG,RADIX)
<	IFN <X1-REG>,< MOVE	X1,REG>
	IFB <RADIX>,< HRRZI	X2,↑D10>
	IFNB <RADIX>,< HRRZI	X2,RADIX>
	CALLR	$NOUT$>

DEFINE	DCNOUT(REG,RADIX)
<	IFN <X1-REG>,< MOVE	X1,REG>
	IFB <RADIX>,< HRROI	X2,↑D10>
	IFNB <RADIX>,< HRROI	X2,RADIX>
	CALLR	$NOUT$>

DEFINE	PATH(STRING,FLAGS)
<	IFB <FLAGS>,< HRRZI	FLAG,STRING>
	IFNB <FLAGS>,<
		HRRI	FLAG,STRING
		HRLI	FLAG,FLAGS>
	CALLR	$PATH$>

DEFINE	SCOPY(SOURCE,DESTIN)
<	CAIA
	 IDPB	0,DESTIN
	ILDB	0,SOURCE
	JUMPN	0,.-2
	MOVE	SOURCE,DESTIN
	IDPB	0,SOURCE
>;SCOPY

;(e)X(pand) T(erminal) C(ommand) I(nput) L(ist)

DEFINE	XTCIL <
	..CMCH==0
	..CMWD==0
	..CNUM==0
	DEFINE TCIE (NAME, ROUTINE)
	<	..CNUM==..CNUM+1
		..IDX==0
		IRPC NAME<..IDX==..IDX+1>
		IFG <..IDX-..CMCH>,<..CMCH==..IDX>
	>;TCIE
	TCIL
	..CMWD==<<<..CMCH-1>/5>+1>

	.+4+..CNUM
	..CNUM
	..CMCH
	..CMWD

	DEFINE TCIE (NAME,ROUTINE)
	<	ROUTINE
	>;TCIE
	TCIL

	DEFINE TCIE (NAME,ROUTINE)
	<	ASCII	/NAME/
		..IDX==0
		IRPC NAME<..IDX==..IDX+1>
		..IDX==<..CMWD-<<<..IDX-1>/5>+1>>
		IFG ..IDX,<REPEAT ..IDX, <0>>
	>;TCIE
	TCIL
>;XTCIL
SUBTTL SAIL definitions

TWOSEG
RELOC	400000

OPDEF THUD [JSP FLAG,OOPS]

OPDEF DSKPPN [047000,,400071]
OPDEF BEEP [047000,,400111]
OPDEF PTJOBX [711700,,0]
OPDEF GETLIN [051300,,0]
OPDEF SETLIN [051340,,0]
OPDEF SETACT [051640,,0]

; POSITIONS IN MTAPE BLOCK

STLOC==1	; STATUS BITS RETURNED HERE
LSLOC==2	; LOCAL SOCKET
WFLOC==3	; WAIT FLAG
BSLOC==4	; BYTE SIZE LOCATION
FSLOC==5	; FOREIGN SOCKET
HLOC==6		; HOST NUMBER

ERRBTS==763600	; I/O ERROR BITS

	DCCHAN==1
	DDCHAN==2
	LFCHAN==3
	LDCHAN==4

DEFINE	TBIN(REG)
<	INCHWL REG
	TRZ REG,400
	TRZE REG,200
	 ANDI REG,37
	CAIL REG,"a"
	 CAILE REG,"z"
	  CAIA
	   SUBI	REG,"a"-"A"
>;TBIN

DEFINE	TBIN1(REG)
<	INCHRW REG
	TRZ REG,400
	TRZE REG,200
	 ANDI REG,37
	CAIL REG,"a"
	 CAILE REG,"z"
	  CAIA
	   SUBI	REG,"a"-"A"
>;TBIN

DEFINE TBOUT(REG)
<	CAIN REG,7
	 JRST [	MOVNI REG,1
		BEEP REG,
		JRST .+2]
	OUTCHR REG
>;TBOUT

DEFINE TSOUT(STRING)
<IRP STRING,<
	OUTSTR	STRING
>;IRP STRING
>;TSOUT

DEFINE	DCBIN(REG)
<	SOSGE DCIBUF+2
	 JRST [	CALLR NUTMI
		JRST .-1]
	ILDB REG,DCIBUF+1
	JUMPE REG,.-3
>;DCIBIN

DEFINE	DCBOUT(REG)
<	IDPB REG,DCOBUF+1
	OUT DCCHAN,
	 CAIA
	  JRST NETEOT>
DEFINE	DCSOUT(STRING)
<	IRP STRING
<	HRRZI X1,STRING
	CALLR NUTMO>
	OUT DCCHAN,
	 CAIA
	  JRST NETEOT>
SUBTTL Main Program

DFTP:	JFCL
	RESET
	OUTSTR [ASCIZ/Welcome to the wonderful world of DFTP.
/]
	MOVE STAK,[IOWD STSIZ,STBEG]	; load PDP
	PTJOBX [0
		SIXBIT/DOFF/]
	SETO
	GETLIN
	CAMN [-1]			; detached?
	 JRST DFTP0
	TLO 100				; special activation
	SETLIN
	SETACT[[777777,,777770		; "controls", space
		000000,,020400		; :, ?
		000000,,000000
		000001,,000000]]	; ALT
	TLNN 460000			; display?
	 SETACT [[	-1
			-1
			-1
			-1,,600000]]
DFTP0:	MOVSI 'DSK'
	MOVEM LFCHAS+1
	SETZ
	DSKPPN
	MOVEM LFIPPN
	CALLR ICP
	CALLR D$INIT			; do DC init
; (((PCAP RESTRICTED))))
IFN F.PCAP,<
	MOVEI UTIL,CMDM1
>
; (((↑↑↑)))
; (((PCAP UNRESTRICTED)))
IFE F.PCAP,<
	MOVEI UTIL,CMDM2
	GETPPN
	 JFCL
	HRRZS
	CAIN 'MRC'			; my autoenable hack
	 MOVEI UTIL,CMDM3
>
; (((↑↑↑)))
	MOVEM UTIL,CMDMOD
	JRST CMDCMD
RENTER:	MOVE STAK,[IOWD STSIZ,STBEG]
CMDNEW:	TSOUT <CRLF>
CMDCMD:	JRST @CMDMOD
CMDM1:	TSOUT <[ASCIZ/*/]>
	TCIN (CMDMC1,[ASCIZ/*/])
	 JRST CMDCMD
	 JRST CMDNEW
	JRST (FLAG)
CMDM2:	TSOUT <[ASCIZ/*/]>
	TCIN (CMDMC2,[ASCIZ/*/])
	 JRST CMDCMD
	 JRST CMDNEW
	JRST (FLAG)
CMDM3:	TSOUT <[ASCIZ/!/]>
	TCIN (CMDMC3,[ASCIZ/!/])
	 JRST CMDCMD
	 JRST CMDNEW
	JRST (FLAG)
SUBTTL Terminal Input Dispatch Tables

DEFINE TCIL <
IFG ..MODE-2,<	TCIE ALLOCATE,CALO >
		TCIE ATTACH,CATT
		TCIE BIG,CBIG
IFG ..MODE-2,<	TCIE CHANGE,CCHA >
		TCIE CONNECT,CCON
IFG ..MODE-2,<	TCIE CREATE,CCRE >
		TCIE DELETE,CDEL
		TCIE DIRECTORY,CDIR
IFG ..MODE-2,<	TCIE DISABLE,CDIS >
IFE ..MODE-2,<	TCIE ENABLE,CENA >
		TCIE EXAMINE,CEXA
		TCIE EXPUNGE,CEXP
		TCIE GET,CGET
IFG ..MODE-2,<	TCIE LINK,CLIN >
		TCIE LIST,CLIS
		TCIE LOCAL-DIRECTORY,CLOD
		TCIE LOCAL-STRUCTURE,CLOS
		TCIE LOCAL-USER,CLOU
		TCIE NO-DATALANGUAGE,CNOD
		TCIE PUT,CPUT
		TCIE QUIT,CQUI
		TCIE REMOVE,CREM
		TCIE RENUMBER,CREN
		TCIE RETRIEVE,CRET
		TCIE SHOW-DATALANGUAGE,CSOD
		TCIE STORE,CSTO
		TCIE TIME-TRANSFERS,CTTR
		TCIE UNDELETE,CUND
		TCIE UNTIME-TRANSFERS,CUTR
>;TCIL

CMDMC1:	..MODE==1
	XTCIL
CMDMC2:	..MODE==2
	XTCIL
CMDMC3:	..MODE==3
	XTCIL
SUBTTL Top level commands

CALO:	PATH	([ASCIZ/ ALLOCATE /],PATHNR!PATHCA)
	 JRST	CMDCMD
	TSOUT	<[ASCIZ/ Megabits: /]>
CALO1:	TNIN	([ASCIZ/ Megabits: /])
	 JRST	CMDCMD
	JUMPN	IO,CALO2
	MOVEI	IO,"G"-100
	TBOUT	<IO>
	JRST	CALO1
CALO2:	MOVEM	IO,ABUF
	TSOUT	<CRLF>
	CALLR	DALO
	JRST	CMDCMD

CATT:	PATH	([ASCIZ/ ATTACH /],PATHNR!PATHCT)
	 JRST	CMDCMD
	CALLR	DATT
	JRST	CMDCMD

CBIG:	PATH	([ASCIZ/ BIG /],PATHNR!PATHCA)
	 JRST	CMDCMD
	CALLR	DBIG
	JRST	CMDCMD

CCHA:	PATH	([ASCIZ/ CHANGE /],PATHNR!PATHCC!PATHAD!PATHAC)
	 JRST	CMDCMD
	CALLR	DCHA
	JRST	CMDCMD

CCON:	PATH	([ASCIZ/ CONNECT /],PATHNR!PATHCA!PATHAD)
	 JRST	CMDCMD
	CALLR	DCON
	JRST	CMDCMD

CCRE:	PATH	([ASCIZ/ CREATE /],PATHNR!PATHCA)
	 JRST	CMDCMD
	CALLR	DCRE
	JRST	CMDCMD

CDEL:	PATH	([ASCIZ/ DELETE /],PATHNP!PATHFR!PATHAS!PATHAC!PATHAV)
	 JRST	CMDCMD
	CALLR	DDEL
	JRST	CMDCMD

CDIR:	PATH	([ASCIZ/ DIRECTORY /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST	CMDCMD
	MOVE	IO,CMDMOD
	CAIN	IO,CMDM3
	 JRST	CDIR1
	TSOUT	<[ASCIZ/**/]>
	TCIN	(CDIRC,[ASCIZ/**/])
	 JRST	CMDCMD
	 JRST	CDIR2
	JRST	CDIR3
CDIR1:	TSOUT	<[ASCIZ/!!/]>
	TCIN	(CDIRC,[ASCIZ/!!/])
	 JRST	CMDCMD
	 JRST	CDIR2
	JRST	CDIR3
CDIR2:	MOVEI	FLAG,DD$T
	TSOUT	<[ASCIZ/TERSE/]>
CDIR3:	TSOUT	<CRLF>
	CALLR	DDIR
	JRST	CMDCMD

CDIRC:
DEFINE TCIL <
	TCIE DELETED,DD$D
	TCIE TERSE,DD$T
	TCIE VERBOSE,DD$V
>;TCIL
	XTCIL

CDIS:	TSOUT	<CRLF>
	MOVEI	UTIL,CMDM2
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD

CENA:	TSOUT	<CRLF>
	MOVEI	UTIL,CMDM3
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD

CEXA:	PATH	([ASCIZ/ EXAMINE /],PATHNP!PATHFR!PATHAV!PATHAS)
	 JRST	CMDCMD
	TSOUT	<[ASCIZ/ Lines per page: /]>
	TNIN	([ASCIZ/ Lines per page: /])
	 JRST	CMDCMD
	JUMPN	IO,CEXA0
	SKIPN	IO,DEXA$P
	 MOVEI	IO,↑D20
	TNOUT	<IO>
CEXA0:	MOVEM	IO,DEXA$P
	TSOUT	<CRLF>
	MOVE	UTIL,VBUF
	LDB	IO,[350700,,FBUF]
	CAIN	IO,"*"
	 SETO	UTIL,
	LDB	IO,[350700,,EBUF]
	CAIN	IO,"*"
	 SETO	UTIL,
	MOVEM	UTIL,DEXA$S
	CALLR	DEXA
	 JRST	CMDCMD
	JRST	CMDCMD

CEXP:	PATH	([ASCIZ/ EXPUNGE /],PATHNR!PATHCC!PATHAD!PATHAC)
	 JRST	CMDCMD
	CALLR	DEXP
	JRST	CMDCMD

CGET:	PATH	([ASCIZ/ GET /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
	 JRST	CMDCMD
	CALLR	DGET
	 JRST	CMDCMD
	JRST	CMDCMD

CLIN:	TSOUT	<CRLF>
	CALLR	DLIN
	JRST	CMDCMD

CLIS:	PATH	([ASCIZ/ LIST /],PATHNR!PATHCC!PATHAS)
	 JRST	CMDCMD
	MOVE	IO,CMDMOD
	CAIN	IO,CMDM3
	 JRST	CLIS1
	TSOUT	<[ASCIZ/**/]>
	TCIN	(CLISC1,[ASCIZ/**/])
	 JRST	CMDCMD
	 JRST	CLIS2
	JRST	CLIS3
CLIS1:	TSOUT	<[ASCIZ/!!/]>
	TCIN	(CLISC2,[ASCIZ/!!/])
	 JRST	CMDCMD
	 JRST	CLIS2
	JRST	CLIS3
CLIS2:	MOVEI	FLAG,DL$T
	TSOUT	<[ASCIZ/TERSE/]>
CLIS3:	TSOUT	<CRLF>
	CALLR	DLIS
	JRST	CMDCMD

CLISC1:
DEFINE TCIL <
	TCIE TERSE,DL$T
	TCIE VERBOSE,DL$V
>;TCIL
	XTCIL
CLISC2:
DEFINE TCIL <
	TCIE PROTECTION,DL$P
	TCIE TERSE,DL$T
	TCIE VERBOSE,DL$V
>;TCIL
	XTCIL

CLOD:	TSOUT	<CRLF>
	SETZM	LUTDSP
CLOD1:	CALLR	LUTDS
	 JRST	CMDCMD
	TSOUT	<[ASCIZ/ /],LUTDSF,CRLF>
	JRST	CLOD1

CLOS:	MOVEI	IO," "
	TBOUT	IO
	TSIN	(UBUF2,SBSIZE,[ASCIZ/ LOCAL-STRUCTURE /])
	 JRST	CMDCMD
	JUMPE	UTIL,[	MOVE BP,[ASCIZ/DSK/]
			MOVEM BP,UBUF2
			TSOUT <UBUF2>
			JRST .+1]
	TSOUT	<CRLF>
	MOVE	BP,[440700,,UBUF2]
CLOS1:	ILDB	IO,BP
	JUMPE	IO,CLOS2
	CAIE	IO,":"
	 JRST	CLOS1
	SETZ	IO,
	DPB	IO,BP
CLOS2:	HRRZI	IO,UBUF2
	CALLR	LUTFN
	MOVE	IO,LFILE
	DEVCHR	IO,
	TLNE	IO,200000
	 JRST	CLOS3
	OUTSTR	[ASCIZ/ (Local structure must be a disk)
/]
	JRST	CMDCMD
CLOS3:	MOVE	IO,LFILE
	MOVEM	IO,LFCHAS+1
	JRST	CMDCMD

CLOU:	OUTSTR [ASCIZ/
 Project: /]
	MOVE IO,[ABUF,,3]	; do not use TSIN macro!!  - MRC
	HRRZI UTIL,[ASCIZ/ Project:/]
	CALLR $TSIN$
	 JRST CMDCMD
	SETZ IO,
	MOVE X1,[440700,,ABUF]
REPEAT 3,<
	ILDB X2,X1
	JUMPE X2,CLOU1A
	LSH IO,6
	ADDI IO,-" "(X2)
>;REPEAT 3
CLOU1A:	HRLZI UTIL,(IO)
	JUMPN IO,CLOU1
	SETZ IO,
	DSKPPN IO,
	 JFCL
	HLLZ UTIL,IO
	OUTSTR [ASCIZ/(self)/]
CLOU1:	OUTSTR	[ASCIZ/
 Programmer: /]
	PUSH STAK,UTIL
	MOVE IO,[ABUF,,3]	; do not use TSIN macro!!  - MRC
	HRRZI UTIL,[ASCIZ/ Programmer:/]
	CALLR $TSIN$
	 JRST [	POP STAK,UTIL
		JRST CMDCMD]
	SETZ IO,
	POP STAK,UTIL
	MOVE X1,[440700,,ABUF]
REPEAT 3,<
	ILDB X2,X1
	JUMPE X2,CLOU2A
	LSH IO,6
	ADDI IO,-" "(X2)
>;REPEAT 3
CLOU2A:	HRRI	UTIL,(IO)
	JUMPN	IO,CLOU2
	SETZ IO,
	DSKPPN IO,
	 JFCL
	HRR UTIL,IO
	OUTSTR [ASCIZ/(self)/]
CLOU2:	TSOUT	<CRLF>
	RELEAS	LDCHAN,
	MOVEM	UTIL,LDIR
	MOVE	IO,[SIXBIT/UFD/]
	MOVEM	IO,LDIR+1
	SETZM	LDIR+2
	MOVE IO,[SIXBIT/  1  1/]
	MOVEM	IO,LDIR+3
	MOVE	IO,LFCHAS+1
	MOVEM	IO,LDCHAS+1
	OPEN	LDCHAN,LDCHAS
	 JRST	CLOU4
	LOOKUP	LDCHAN,LDIR
	 JRST	CLOU4
	RELEAS	LDCHAN,
	MOVEM	UTIL,LFIPPN
	JRST	CMDCMD
CLOU4:	OUTSTR	[ASCIZ/ (No such directory)
/]
	JRST	CMDCMD

CNOD:	SETZM	FLAGDD
	JRST	CMDNEW

CPUT:	PATH	([ASCIZ/ PUT /],PATHNP!PATHFR!PATHLR!PATHAS)
	 JRST	CMDCMD
	CALLR	DPUT
	 JRST	CMDCMD
	JRST	CMDCMD

CQUI:	TAIN	<[ASCIZ/ [Confirm]/]>
	 JRST	CMDCMD
	 JRST	CMDCMD
	JRST	QUIT

CREM:	PATH	([ASCIZ/ REMOVE /],PATHNR!PATHCC!PATHAS!PATHAC)
	 JRST	CMDCMD
	CALLR	DREM
	JRST	CMDCMD

CREN:	PATH	([ASCIZ/ RENUMBER /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST	CMDCMD
	SKIPLE	X1,VBUF
	 JRST	CREN2
	JUMPL	X1,CREN1
	LDB	UTIL,[350700,,FBUF]
	CAIN	UTIL,"*"
	 JRST	CREN1
	LDB	UTIL,[350700,,EBUF]
	CAIE	UTIL,"*"
	 JRST	CREN2
CREN1:	TSOUT	<[ASCIZ/ (A version number is required if *'s are used.)/],CRLF>
	JRST	CMDCMD
CREN2:	TSOUT	<[ASCIZ/ New version number: /]>
	TNIN	([ASCIZ/ New version number: /])
	 JRST	CMDCMD
	JUMPN	IO,CREN3
	MOVEI	IO,"1"
	TBOUT	<IO>
	MOVEI	IO,1
CREN3:	MOVEM	IO,ABUF
	TSOUT	<CRLF>
	CALLR	DREN
	JRST	CMDCMD

CRET:	PATH	([ASCIZ/ RETRIEVE /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
	 JRST	CMDCMD
	CALLR	DGET
	 JRST	CMDCMD
	JRST	CMDCMD

CSOD:	SETOM	FLAGDD
	JRST	CMDNEW

CSTO:	PATH	([ASCIZ/ STORE /],PATHNP!PATHFR!PATHLR!PATHAS)
	 JRST	CMDCMD
	CALLR	DPUT
	 JRST	CMDCMD
	JRST	CMDCMD

CTER:	SETOM FLAGNN
	SETZM FLAGDD
	SETZM FLAGTT
	JRST CMDNEW

CTTR:	SETOM	FLAGTT
	JRST	CMDNEW

CUND:	PATH	([ASCIZ/ UNDELETE /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST	CMDCMD
	CALLR	DUND
	JRST	CMDCMD

CUTR:	SETZM	FLAGTT
	JRST	CMDNEW

CVER:	SETZM FLAGNN
	JRST CMDNEW
SUBTTL Path input and translation

; FLAG DEFINITIONS
	PATHNR==400000		; NODE REQUIRED
	PATHNP==200000		; NODE POSSIBLE
	PATHNF==100000		; NODE FOUND
	PATHFR==040000		; FILE REQUIRED
	PATHFF==020000		; FILE FOUND
	PATHCT==004000		; CONTEXT TOP
	PATHCA==002000		; CONTEXT ATTACH
	PATHCC==001000		; CONTEXT CONNECT
	PATHLR==000400		; LOCAL TO REMOTE
	PATHRL==000200		; REMOTE TO LOCAL
	PATHAS==000040		; ALLOW SETS
	PATHAD==000020		; ALLOW (NON-SET) DEFAULT
	PATHAV==000010		; ALLOW VERSIONS
	PATHAC==000004		; ACKNOWLEDGE [CONFIRM]

; PATH INPUT CONTROL
;   IN: TCIO -- LAST CHARACTER INPUT (TCIN)
;	FLAG -- FLAGS,,COMMAND STRING POINTER
;
$PATH$:	BEGINR	<IO,UTIL>
	MOVEI	IO," "
	TBOUT	<IO>
	MOVE	IO,[GBUF1,,5*LBSIZE]
	SETZ	UTIL,
	CALLR	P$IN
	 RETURN
	PUSH	STAK,IO
	MOVE	IO,[GBUF1,,NBUF]
	MOVE	UTIL,[FBUF,,EBUF]
	CALLR	P$PP
	POP	STAK,IO
	MOVEM	UTIL,VBUF
	TLNN	FLAG,PATHAC
	 JRST	PAT$10
	TAIN	<[ASCIZ/ [Confirm]/]>
	 RETURN
	 RETURN
	RETURN	SKIP,1
PAT$10:	TLNE	FLAG,PATHRL!PATHLR
	 JRST	PAT$11
	TSOUT	<CRLF>
	RETURN	SKIP,1
PAT$11:	PUSH	STAK,IO
	MOVE	IO,[FBUF,,EBUF]
	CALLR	P$LF
	POP	STAK,IO
	CAIE	IO,175
	 CAIN	IO," "
	  JRST	PAT$20
PAT$12:	TSOUT <CRLF>
	RETURN	SKIP,1
PAT$20:	TLNE	FLAG,PATHLR
	 JRST	PAT$21
	TLNE	FLAG,PATHRL
	 JRST	PAT$22
	JRST	PAT$23
PAT$21:	TLNE	FLAG,PATHNF
	 JRST	PAT$12
	JRST	PAT$23
PAT$22:
	TLZ	FLAG,PATHNR!PATHNP!PATHAV
PAT$23:	TSOUT	<[ASCIZ/ [As] /]>
	MOVE	IO,[GBUF2,,5*LBSIZE]
	MOVE	UTIL,[GBUF1,,[ASCIZ/ [As] /]]
	CALLR	P$IN
	 RETURN
	TLNE	FLAG,PATHLR
	 JRST	PAT$24
	TLNE	FLAG,PATHRL
	 JRST	PAT$25
	RETURN
PAT$24:	MOVE	IO,[GBUF2,,NBUF]
	MOVE	UTIL,[FBUF,,EBUF]
	CALLR	P$PP
	MOVEM	UTIL,VBUF
	TSOUT	<CRLF>
	RETURN	SKIP,1
PAT$25:	MOVE	IO,[GBUF2,,GBUF1]
	MOVE	UTIL,[FSBUF,,ESBUF]
	CALLR	P$PP
	MOVE	IO,[FSBUF,,ESBUF]
	CALLR	P$LF
	TSOUT <CRLF>
	ENDR	SKIP,1
; PATH INPUT
;   IN: IO -- POINTER TO PATH BUFFER,,SIZE OF PATH BUFFER
;       UTIL -- FIRST PATH,,TIE MSG (OR ZERO)
;       FLAG -- (SAME AS $PATH$)
;   OUT: IO -- LAST CHARACTER INPUT
;        UTIL -- COUNT OF CHARACTERS
;   FLAGS:
	P$I$AE==400000		; ANCHOR ENCOUNTERED (<)
	P$I$DE==200000		; DESCENDER ENCOUNTERED (>,.)
	P$I$SE==100000		; SET ENCOUNTERED (*)
	P$I$TE==040000		; TRAILING NODE SET ENCOUNTERED (**)
	P$I$PW==010000		; INPUT PASSWORD
	P$I$CC==004000		; <
	P$I$CA==002000		; <<
	P$I$CT==001000		; <<<
	P$I$EP==000400		; EXTENSION BEING PROCESSED
	P$I$VP==000200		; VERSION BEING PROCESSED

P$IN:	BEGINR	<BP,R10,R11,R12,R13>
	SETZ	R10,
	MOVE	R11,IO
	MOVE	R12,UTIL
	HLR	BP,IO
	HRLI	BP,440700
	SETZ	UTIL,
P$ICHR:	TBIN	<IO>
	CAIN	IO,"R"-100
	 JRST	P$IREP
	CAIE	IO,177
	 CAIN	IO,"A"-100
	  JRST	P$IDEL
	CAIE	IO,"U"-100
	 CAIN	IO,"X"-100
	  JRST	P$IENR
	CAIN	IO,15
	 JRST	P$ICHR
	CAIE	IO,12
	 CAIN	IO,175
	  JRST	P$IEND
	CAIN	IO,37
	 JRST	P$IEND
	CAIL	IO," "
	 CAIN	IO,42
	  JRST	P$IBAD
	CAIE	IO,47
	 TRNE	R10,P$I$TE
	  JRST	P$IBAD
	CAIL	UTIL,(R11)
	 JRST	P$IBAD
	TRNE	R10,P$I$PW
	 JRST	P$ICHP
	CAIN	IO," "
	 JRST	P$IEND
	CAIN	IO,"?"
	 JRST	P$IBAD
	CAIN	IO,"*"
	 JRST	P$ISS
	TRNE	R10,P$I$VP
	 JRST	P$ISVN
	CAIN	IO,";"
	 JRST	P$ISVS
	CAIN	IO,":"
	 JRST	P$IPON
	CAIN	IO,"<"
	 JRST	P$ISA
	CAIN	IO,">"
	 JRST	P$ISD1
	CAIN	IO,"."
	 JRST	P$ISD2
	TRNE	R10,P$I$SE
	 JRST	P$IBAD
	TRZ	R10,P$I$AE!P$I$DE
P$ICHE:	IDPB	IO,BP
	TBOUT	<IO>
	AOJA	UTIL,P$ICHR
P$ICHP:	CAIN	IO,">"
	 JRST	P$IPOF
	CAIN	IO,"'"
	 JRST	P$IBAD
	IDPB	IO,BP
	AOJA	UTIL,P$ICHR
P$ISA:	TLNN	FLAG,PATHNR!PATHNP
	 JRST	P$IBAD
	TRNN	R10,P$I$CC
	 JRST	P$ISA1
	TRNN	R10,P$I$CA
	 JRST	P$ISA2
	TRNN	R10,P$I$CT
	 JRST	P$ISA3
	JRST	P$IBAD
P$ISA1:	JUMPN	UTIL,P$IBAD
	TRO	R10,P$I$AE!P$I$CC
	JRST	P$ICHE
P$ISA2:	CAIE	UTIL,1
	 JRST	P$IBAD
	TRO	R10,P$I$AE!P$I$CA
	JRST	P$ICHE
P$ISA3:	CAIE	UTIL,2
	 JRST	P$IBAD
	TRO	R10,P$I$AE!P$I$CT
	JRST	P$ICHE
P$ISD1:	TLNE	FLAG,PATHNR!PATHNP
	 TRNE	R10,P$I$AE!P$I$EP
	  JRST	P$IBAD
	JUMPE	UTIL,P$IBAD
	TLNE	FLAG,PATHFR
	 TRNN	R10,P$I$SE
	  TROE	R10,P$I$DE
	   JRST	P$IBAD
	JRST	P$ISD9
P$ISD2:	TLNE	FLAG,PATHFR
	 TRNE	R10,P$I$AE!P$I$DE!P$I$EP
	  JRST	P$IBAD
	JUMPE	UTIL,P$IBAD
	TRO	R10,P$I$DE!P$I$EP
P$ISD9:	TRZ	R10,P$I$SE
	JRST	P$ICHE
P$ISVS:	TLNE	FLAG,PATHAV
	 TLNN	FLAG,PATHFR
	  JRST	P$IBAD
	JUMPE	UTIL,P$IBAD
	TRNE	R10,P$I$DE
	 TRNE	R10,P$I$EP
	  TRNE	R10,P$I$AE!P$I$VP
	   JRST	P$IBAD
	TRZ	R10,P$I$SE!P$I$EP
	TRO	R10,P$I$VP!P$I$DE
	JRST	P$ICHE
P$ISVN:	CAIL	IO,"0"
	 CAILE	IO,"9"
	  JRST	P$IBAD
	TRNE	R10,P$I$SE
	 JRST	P$IBAD
	TRZ	R10,P$I$DE
	JRST	P$ICHE
P$ISS:	TLNN	FLAG,PATHAS
	 JRST	P$IBAD
	TRNE	R10,P$I$SE
	 JRST	P$IST
	TRZN	R10,P$I$AE!P$I$DE
	 JUMPN	UTIL,P$IBAD
	TRO	R10,P$I$SE
	JRST	P$ICHE
P$IST:	TLNN	FLAG,PATHFR
	 TRNN	R10,P$I$EP!P$I$VP
	  JRST	P$IBAD
	TRO	R10,P$I$TE
	JRST	P$ICHE
P$IPON:	TLNE	FLAG,PATHNR!PATHNP
	 TRNE	R10,P$I$AE!P$I$DE!P$I$SE
	  JRST	P$IBAD
	CAIL	UTIL,-1(R11)
	 JRST	P$IBAD
	IDPB	IO,BP
	TBOUT	<IO>
	MOVEI	X1,"P"-100
	IDPB	X1,BP
	ADDI	UTIL,2
	TRO	R10,P$I$PW
	JRST	P$ICHR
P$IPOF:	CAIL	UTIL,-1(R11)
	 JRST	P$IBAD
	MOVEI	X1,"P"-100
	IDPB	X1,BP
	IDPB	IO,BP
	TBOUT	<IO>
	ADDI	UTIL,2
	TRZ	R10,P$I$PW
	TRO	R10,P$I$DE
	JRST	P$ICHR
P$IBAD:	MOVEI	IO,"G"-100
	TBOUT	<IO>
	JRST	P$ICHR
P$IREP:	TSOUT	<CRLF>
	TSOUT	<(FLAG)>
	JUMPE	R12,P$IR04
	HLR	R13,R12
	HRLI	R13,440700
	TRZ	R10,P$I$PW
P$IR01:	ILDB	IO,R13
	JUMPE	IO,P$IR03
	CAIN	IO,"P"-100
	 JRST	P$IR02
	TRNE	R10,P$I$PW
	 JRST	P$IR01
	TBOUT	<IO>
	JRST	P$IR01
P$IR02:	TRC	R10,P$I$PW
	JRST	P$IR01
P$IR03:	TSOUT	<(R12)>
P$IR04:	HRRZI	IO,(BP)
	HLR	R13,R11
	CAIGE	IO,(R13)
	 JRST	P$ICHR
	HRLI	R13,440700
	TRZ	R10,P$I$PW
P$IR05:	CAMN	R13,BP
	 JRST	P$ICHR
	ILDB	IO,R13
	CAIN	IO,"P"-100
	 JRST	P$IR06
	TRNE	R10,P$I$PW
	 JRST	P$IR05
	TBOUT	<IO>
	JRST	P$IR05
P$IR06:	TRC	R10,P$I$PW
	JRST	P$IR05
P$IDEL:	JUMPE	UTIL,P$IENR
	MOVEI	IO,"\"
	TBOUT	<IO>
	LDB	IO,BP
	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	CAIN	IO,"P"-100
	 JRST	P$ID01
	LDB	X1,BP
	CAIN	X1,"P"-100
	 JRST	P$ID02
	TRNE	R10,P$I$PW
	 SOJA	UTIL,P$ICHR
	TBOUT	<IO>
	TRZ	R10,P$I$AE!P$I$DE!P$I$SE!P$I$TE
	CAIN	IO,"."
	 TRZ	R10,P$I$EP
	CAIN	IO,";"
	 TRZ	R10,P$I$VP
	CAIE	IO,"<"
	 JRST	P$ID00
	TRZE	R10,P$I$CT
	 JRST	P$ID00
	TRZE	R10,P$I$CA
	 JRST	P$ID00
	TRZ	R10,P$I$CC
P$ID00:	SOJE	UTIL,P$ICHR
	LDB	X1,BP
	CAIN	X1,"<"
	 TRO	R10,P$I$AE
	CAIE	X1,">"
	 CAIN	X1,"."
	  TRO	R10,P$I$DE
	CAIN	X1,";"
	 TRO	R10,P$I$DE
	CAIN	X1,"*"
	 TRO	R10,P$I$SE
	JRST	P$ICHR
P$ID01:	TRZ	R10,P$I$PW
	LDB	IO,BP
	JRST	P$ID03
P$ID02:	TROE	R10,P$I$PW
	 SOJA	UTIL,P$ICHR
	TRZ	R10,P$I$DE
P$ID03:	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	TBOUT	<IO>
	SUBI	UTIL,2
	JRST	P$ICHR
P$IENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETO	IO,
	SETZ	UTIL,
	RETURN
P$IEND:	CAIE	IO,12
	 CAIN	IO,37
	  JRST	P$IENL
	TLNN	FLAG,PATHAS
	 JRST	P$IENV
	JUMPE	UTIL,P$IENV
	LDB	R13,BP
	CAIN	R13,">"
	 JRST	P$IENT
	TLNE	FLAG,PATHFR
	 TLNE	FLAG,PATHAS
	  JRST	P$IENV
	CAIA
P$IENL:	 TLNE	FLAG,PATHFR
	  TRNN	R10,P$I$AE
	   JRST P$IENV
	JRST	P$IBAD
P$IENV:	TRNE	R10,P$I$DE
	 TRNE	R10,P$I$EP
	  CAIA
	  JRST	P$IBAD
	JUMPN	UTIL,P$IENN
	TLNN	FLAG,PATHAS
	 JRST	P$IENC
	MOVE	R12,[440700,,[ASCIZ/**/]]
	TLNN	FLAG,PATHFR
	 JRST	P$IENS
	HRRI	R12,[ASCIZ/*.*/]
	TLNE	FLAG,PATHAV
	 HRRI	R12,[ASCIZ/*.*;*/]
	JRST	P$IENS
P$IENC:	TLNN	FLAG,PATHAD
	 JRST	P$IBAD
	MOVE	R12,[440700,,[ASCIZ/<</]]
	TLNE	FLAG,PATHCC
	 HRRI	R12,[ASCIZ/</]
	JRST	P$IENS
P$IENN:	TLNE	FLAG,PATHAS
	 TRNE	R10,P$I$EP!P$I$VP
	  JRST	P$IENZ
	TLNE	FLAG,PATHFR
	 TRNE	R10,P$I$AE!P$I$DE
	  CAIN	IO,12
	   JRST	P$IENZ
	CAIN	IO,37
	 JRST	P$IENZ
	LDB	R13,BP
	CAIN	R13,"<"
	 JRST	P$IENT
	MOVEI	R13,">"
	IDPB	R13,BP
	TBOUT	<R13>
	ADDI	UTIL,1
P$IENT:	MOVE	R12,[440700,,[ASCIZ/**/]]
	TLNN	FLAG,PATHFR
	 JRST	P$IENS
	HRRI	R12,[ASCIZ/*.*/]
	TLNE	FLAG,PATHAV
	 HRRI	R12,[ASCIZ/*.*;*/]
P$IENS:	ILDB	R13,R12
	IDPB	R13,BP
	JUMPE	R13,RETN(1)
	TBOUT	<R13>
	AOJA	UTIL,P$IENS
P$IENZ:	SETZ	R13,
	IDPB	R13,BP
	ENDR	SKIP,1
; P$PP -- PROCESS PATH (NODES AND FILES)
;   IN: IO -- SOURCE,,NODE DESTINATION
;	UTIL -- FILE DESTINATION,,EXTENSION DESTINATION
;	FLAG -- PATH CONTEXT FLAGS
;   OUT: FLAG -- FOUND FLAGS
;	 UTIL -- VERSION NUMBER (-1 *) (0 NONE)
;
P$PP:	BEGINR	<BP>
	TLNE	FLAG,PATHNR
	 JRST	P$PN
	HLR	BP,IO
	HRLI	BP,440700
	TLNN	FLAG,PATHNP
	 JRST	P$PF0
	SETZM	(IO)
	MOVE	X1,BP
P$PS2:	MOVE	X2,BP
P$PS1:	ILDB	X3,BP
	CAIE	X3,"<"
	 CAIN	X3,">"
	  JRST	P$PS2
	CAIE	X3,"."
	 CAIN	X3,";"
	  JRST	P$PS3
	JUMPE	X3,P$PS3
	JRST	P$PS1
P$PS3:	MOVE	BP,X2
	CAMN	BP,X1
	 JRST	P$PF
	TLO	FLAG,PATHNF
	MOVE	X1,BP
	LDB	X2,X1
	CAIN	X2,"<"
	 ILDB	X2,X1
	SETZ	X3,
	DPB	X3,X1
	PUSH	STAK,X1
	PUSH	STAK,X2
	CALLR	P$CP
	POP	STAK,X2
	POP	STAK,X1
	DPB	X2,X1
	JRST	P$PF
P$PN:	TLO	FLAG,PATHNF
	CALLR	P$CP
	RETURN
P$PF:	SKIPE	(IO)
	 JRST	P$PF0
	MOVE	X1,[440700,,CONTEX]
	MOVE	X2,[440700,,NBUF]
	SCOPY	(X1,X2)
P$PF0:	TLO	FLAG,PATHFF
	SETZM	(UTIL)
	HLRZ	X1,UTIL
	HRLI	X1,440700
P$PF1:	ILDB	X2,BP
	IDPB	X2,X1
	JUMPE	X2,P$PF3
	CAIN	X2,";"
	 JRST	P$PF4
	CAIE	X2,"."
	 JRST	P$PF1
	SETZ	X2,
	DPB	X2,X1
	HRRZI	X1,(UTIL)
	HRLI	X1,440700
P$PF2:	ILDB	X2,BP
	IDPB	X2,X1
	CAIN	X2,";"
	 JRST	P$PF4
	JUMPN	X2,P$PF2
P$PF3:	SETZ	UTIL,
	RETURN
P$PF4:	SETZ	X2,
	DPB	X2,X1
	ILDB	X2,BP
	CAIE	X2,"*"
	 JRST	P$PF5
	SETO	UTIL,
	RETURN
P$PF5:	SETZ	UTIL,
P$PF6:	SUBI	X2,"0"
	IMULI	UTIL,↑D10
	ADDI	UTIL,(X2)
	ILDB	X2,BP
	JUMPN	X2,P$PF6
	ENDR
; CONVERT PATH FROM DFTP FORM TO DATACOMPUTER FORM
;   IN: IO -- SOURCE,,DESTINATION
; 	FLAG -- PATH CONTEXT FLAGS
;
P$CP:	BEGINR	<IO,FLAG>
	MOVEI	X1,<<LBSIZE*5>-1>
	HLRZ	X2,IO
	HRLI	X2,350700
	HRRI	X3,(IO)
	HRLI	X3,440700
	LDB	IO,X2
	CAIN	IO,"<"
	 JRST	P$CPCX
	TLNE	FLAG,PATHCT
	 JRST	P$CPCT
	TLNE	FLAG,PATHCA
	 JRST	P$CPCA
	JRST	P$CPCC
P$CPCX:	ILDB	IO,X2
	CAIE	IO,"<"
	 JRST	P$CPCC
	ILDB	IO,X2
	CAIE	IO,"<"
	 JRST	P$CPCA
	ILDB	IO,X2
P$CPCT:	MOVE	X4,[440700,,[ASCIZ/%TOP./]]
	SCOPY	(X4,X3)
	MOVE	X4,[440700,,ANCHOR]
	SCOPY	(X4,X3)
	SUBI	X1,11
	JRST	P$CPCE
P$CPCA:	MOVE	X4,[440700,,[ASCIZ/%LOGIN/]]
	SCOPY	(X4,X3)
	SUBI	X1,6
	JRST	P$CPCE
P$CPCC:	MOVE	X4,[440700,,CONTEX]
	ILDB	0,X4
	JUMPE	0,.+4
	SOJL	X1,P$CPE
	IDPB	0,X3
	JRST	.-4
	MOVE	X4,X3
	IDPB	0,X4
P$CPCE:	JUMPE	IO,P$CPZ0
	MOVEI	X4,"."
	IDPB	X4,X3
	MOVEI	X4,42
	SETZ	FLAG,
	SOJA	X1,P$CPI0
P$CPI:	ILDB	IO,X2
P$CPI0:	CAIN	IO,"P"-100
	 JRST	P$CPI
	CAIN	IO,">"
	 JRST	P$CPS
	JUMPE	IO,P$CPZ
	JUMPN	FLAG,P$CPO
	CAIN	IO,":"
	 JRST	P$CPP
	CAIN	IO,"*"
	 JRST	P$CPO
	CAIL	IO,"A"
	 CAILE	IO,"Z"
	  JRST	P$CPQ
P$CPO:	SOJL	X1,P$CPE
	IDPB	IO,X3
	JRST	P$CPI
P$CPQ:	SOJL	X1,P$CPE
	IDPB	X4,X3
	JRST	P$CPO
P$CPS:	JUMPE	FLAG,.+6
	MOVEI	IO,"'"
	IDPB	IO,X3
	MOVEI	IO,")"
	IDPB	IO,R3
	SETZ	FLAG,
	MOVEI	IO,"."
	JRST	P$CPO
P$CPP:	SUBI	X1,4
	JUMPL	X1,P$CPE
	MOVEI	IO,"("
	IDPB	IO,R3
	MOVEI	IO,"'"
	IDPB	IO,R3
	SETO	FLAG,
	JRST	P$CPI
P$CPE:	TSOUT	<[ASCIZ/ (Pathname too long)/],CRLF>
	MOVE	STAK,[IOWD STSIZ,STBEG]
	JRST	CMDCMD
P$CPZ:	JUMPE	FLAG,P$CPZ0
	MOVEI	X1,"'"
	IDPB	X1,X3
	MOVEI	X1,")"
	IDPB	X1,X3
P$CPZ0:	IDPB	IO,X3
	ENDR
; LOCAL FILE NAME PREPARATION
;   IN: IO -- FILE LOCATION,,EXTENSION LOCATION
;
P$LF:	BEGINR	<IO>
	HLL	X1,IO
	HRRI	X1,FSBUF
	BLT	X1,<FSBUF+SBSIZE-1>
	LDB	X1,[350700,,FSBUF]
	CAIN	X1,"*"
	 SETOM	FSBUF
	HRLZI	X1,(IO)
	HRRI	X1,ESBUF
	BLT	X1,<ESBUF+SBSIZE-1>
	LDB	X1,[350700,,ESBUF]
	CAIN	X1,"*"
	 SETOM	ESBUF
	CAIN	X1,0
	 SETZM	ESBUF
	HLR	X1,IO
	HRLI	X1,440700
	MOVE	X2,[440700,,ABUF]
P$LF1:	ILDB	X3,X1
	IDPB	X3,X2
	JUMPN	X3,P$LF1
	SKIPN	(IO)
	 JRST	P$LF2
	MOVEI	X3,"."
	DPB	X3,X2
	HRRZI	X1,(IO)
	HRLI	X1,440700
P$LF3:	ILDB	X3,X1
	IDPB	X3,X2
	JUMPN	X3,P$LF3
P$LF2:
	HRRZI	IO,ABUF
	CALLR	LUTFN
	ENDR
SUBTTL Datacomputer interface routines

; DALO -- ALLOCATE SPACE
;
DALO:	BEGINR
	DCSOUT	<[ASCIZ/MODIFY /],NBUF,<[ASCIZ/,M=/]>>
	MOVE	IO,ABUF
	DCNOUT	<IO>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DATT -- LOGIN TO NODE
;
DATT:	BEGINR
	DCSOUT	<[ASCIZ/LOGIN /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[ASCII/%LOGI/]
	MOVEM	X1,CONTEX
	MOVE	X1,[ASCII/N/]
	MOVEM	X1,<CONTEX+1>
	SKIPN	OPENED
	 RETURN
	SETZM	OPENED
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DBIG -- CREATE A <BIG> FILE
;
DBIG:	BEGINR	<IO>
	DCSOUT	<[ASCIZ/LIST /],NBUF,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	DBIG1
	TSOUT	<[ASCIZ/ [Old Node]/],CRLF>
	JRST	DBIG2
DBIG1:	TSOUT	<[ASCIZ/ [New Node]/],CRLF>
	DCSOUT	<[ASCIZ/CREATE /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
DBIG2:	SKIPN	OPENED
	 JRST	DBIG3
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
	SETZM	OPENED
DBIG3:	DCSOUT	<[ASCIZ/CREATE /],NBUF,[ASCIZ/."<FILES"> LIKE %TOP.DFTP."<BIG">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,OPENED]
	SCOPY	(X1,X2)
	SETZM	OPENEM
	DCSOUT	<[ASCIZ/"<FILES">="<TERSE">/],SEMI>
	MOVE	IO,[ASCII/.I231/]
	CALLR	RENFIP
	 RETURN
	MOVEI	IO,"Z"-100
	DCBOUT	<IO>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,CONTEX]
	SCOPY	(X1,X2)
	ENDR
; DCHA -- CHANGE PRIVILEGES (DELETE AND ADD)
;
DCHA:	BEGINR <IO,UTIL>
	DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIV/],SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
DCHAD:	DCSOUT <[ASCIZ/DELETEP /],NBUF,<[ASCIZ/,N=1/]>,SEMI>
	SETZM FLAGDE
	CALLR RENDER
	 CAIA
	  JRST DCHAD
	TSOUT <[ASCIZ/ [Ok]/],CRLF>
DCHAI:	TAIN <[ASCIZ/ Add a new privilege? /]>
	 RETURN
	 RETURN
	SETZM ABUF		; WRITE FLAG
	SETZM <ABUF+1>		; HOST
	SETZM  <ABUF+2>		; SOCKET
	SETOM <ABUF+3>		; PASSWORD
	TAIN <[ASCIZ/  Allow control? /]>
	 JRST DCHAI
	 SETOM ABUF
	TAIN <[ASCIZ/  Restrict via network? /]>
	 JRST DCHAI
	 JRST DCHAI5
DCHAI1:	TSOUT <[ASCIZ/   Host number (octal): /]>
	TNIN ([ASCIZ/   Host number (octal): /],10)
	 JRST DCHAI
	JUMPN IO,DCHA1A
	OUTSTR [ASCIZ/ SAIL/]
	MOVEI IO,LHOST
	TNOUT (IO,10)
DCHA1A:	TSOUT <CRLF>
DCHAI2:	MOVEM IO,<ABUF+1>
	CAIN IO,LHOST
	 JRST DCHAI3
	TSOUT <[ASCIZ/   Socket number (octal): /]>
	TNIN ([ASCIZ/   Socket number (octal): /],10)
	 JRST DCHAI
	JRST DCHAI4
DCHAI3:	SETZ IO,
DCHAI4:	MOVEM IO,<ABUF+2>
	TSOUT <CRLF>
DCHAI5:	TAIN <[ASCIZ/  Restrict via password? /]>
	 JRST DCHAI
	 JRST DCHAC
	TSOUT <[ASCIZ/   Password: /]>
	TSIN (<ABUF+3>,<SBSIZE-3>,[ASCIZ/   Password: /])
	 JRST DCHAI
	TSOUT <CRLF>
DCHAC:	DCSOUT <[ASCIZ/CREATEP /],NBUF,<[ASCIZ/,U=**,G=LR/]>>
	SKIPE ABUF
	 JRST DCHAC1
	DCSOUT <[ASCIZ/CWA/]>
DCHAC1:	SKIPN <ABUF+1>
	 JRST DCHAC3
	DCSOUT <<[ASCIZ/,H=/]>>
	MOVE IO,<ABUF+1>
	DCNOUT <IO>
	DCSOUT <<[ASCIZ/,S=/]>>
	MOVE IO,<ABUF+2>
	JUMPE IO,DCHAC2
	DCNOUT <IO>
	JRST DCHAC3
DCHAC2:	DCSOUT <[ASCIZ/ANY/]>
DCHAC3:	SETO IO,
	CAMN IO,<ABUF+3>
	 JRST DCHAC4
	DCSOUT <<[ASCIZ/,P='/]>,<ABUF+3>,[ASCIZ/'/]>
DCHAC4:	DCSOUT <SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	TSOUT <[ASCIZ/  [Ok]/],CRLF>
	JRST DCHAI
DCHAI8:	TSOUT <[ASCIZ/ (User not found)/],CRLF>
	JRST DCHAI
	ENDR
; DCON -- CONNECT (VERIFY CONTEXT)
;
DCON:	BEGINR
	DCSOUT	<[ASCIZ/LIST /],NBUF,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	DCON1
	TSOUT	<[ASCIZ/ [Old Node]/],CRLF>
	JRST	DCON2
DCON1:	TAIN	<[ASCIZ/ [New Node][Confirm]/]>
	 RETURN
	 RETURN
	DCSOUT	<[ASCIZ/CREATE /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
DCON2:	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,CONTEX]
	SCOPY	(X1,X2)
	ENDR

; DCRE -- CREATE NEW NODE
;
DCRE:	BEGINR
	DCSOUT	<[ASCIZ/CREATE /],NBUF,<[ASCIZ/,M=/]>>
	MOVEI	IO,DEFALO
	DCNOUT	<IO>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	CALLR	DCHA
	ENDR
; DDEL -- DELETE FILES
;
DDEL:	BEGINR	<IO>
	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	SETO	IO,
	CALLR	D$VER
	 RETURN
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE DELETED INTEGER
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DELETED=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	UPDATE FILES IN "<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT <[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		STATUS='D'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		DELETED=DELETED+1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT FILES.FILE.HEADER.FILENAME
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		  ! '.' ! FILES.FILE.HEADER.EXTENSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		    ! ';' ! FILES.FILE.HEADER.VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF DELETED EQ 0 THEN ERROR 'NO SUCH FILE'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END;
/]>
	CALLR	RENDER
	 RETURN
	ENDR
; DDIR -- FILE DIRECTORY
;   IN:  FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DDIR:	BEGINR	<IO,UTIL>
	SETO	IO,
	CALLR	D$OPEN
	 RETURN
	SKIPN	VBUF
	 SETOM	VBUF
	SETZ	UTIL,
	CAIN	FLAG,DD$D
	 JRST	DDIRO1
	CAIN	FLAG,DD$T
	 JRST	DDIRO2
	CAIN	FLAG,DD$V
	 JRST	DDIRO3
	RETURN
DDIRO1:	DCSOUT	<[ASCIZ/"<TERSE">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ 'D'/]
	JRST	DDIRO4
DDIRO2:	DCSOUT	<[ASCIZ/"<TERSE">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	JRST	DDIRO4
DDIRO3:	DCSOUT	<[ASCIZ/"<VERBOSE">="<FILES">/]>
	SETZ	IO,
DDIRO4:	CALLR	D$WITH
	DCSOUT	<SEMI>
	MOVE	IO,[ASCII/.I241/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
DDIRF:	CALLR	RENPRE
	CAMN	IO,[ASCII/     /]
	 JRST	DDIRF1
	CAMN	IO,[ASCII/.I261/]
	 JRST	DDIRF3
	LDB	IO,[350700,,IO]
	CAIN	IO,";"
	 JRST	DDIRF2
	CALLR	RENLIP
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DDIRF1:	CALLR	<(FLAG)>
	AOJA	UTIL,DDIRF
DDIRF2:	CALLR	RENLIN
	JRST	DDIRF
DDIRF3:	CALLR	RENLIN
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	JUMPN	UTIL,RETN(0)
	TSOUT	<[ASCIZ/ [No Files]/],CRLF>
	ENDR

; DD$D -- DELETED FILES
;
DD$D:	BEGINR
	CALLR	DD$T
	ENDR

; DD$T -- TERSE FILES
;
DD$T:	BEGINR	<IO>
	SKIPE	FLAGDD
	 JRST	DD$T1
	MOVEI	IO,11
	TBOUT	<IO>
DD$T1:	DCBIN	<IO>
	SKIPE	FLAGDD
	 JRST	DD$T2
	TBOUT	<IO>
DD$T2:	CAIE	IO,12
	 JRST	DD$T1
	ENDR

; DD$V -- VERBOSE FILES
;
DD$V:	BEGINR	<IO>
	SKIPE	FLAGDD
	 JRST	DD$V1
	MOVEI	IO,11
	TBOUT	<IO>
DD$V1:	DCBIN	<IO>
	SKIPE	FLAGDD
	 JRST	DD$V3
	CAIN	IO,11
	 JRST	DD$V2
	TBOUT	<IO>
	JRST	DD$V3
DD$V2:	TSOUT	<CRLF>
	TBOUT	<IO>
	TBOUT	<IO>
	JRST	DD$V1
DD$V3:	CAIE	IO,12
	 JRST	DD$V1
	ENDR
; DEXA -- EXAMINE (LIST FILES TO TERMINAL)
;
DEXA:	BEGINR	<IO,FLAG>
	SETZ	FLAG,
	SETO	IO,
	CALLR	D$OPEN
	 RETURN
	SKIPLE	VBUF
	 JRST	DEXA1
	MOVEI	IO," "
	CALLR	D$VER
	 RETURN
	JRST	DEXA2
DEXA1:	CALLR	D$VEX
	 RETURN
DEXA2:	DCSOUT	<[ASCIZ/"<GET">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT	<SEMI>
	CALLR	NETOI
	 THUD
	MOVE	IO,[ASCII/;I249/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
	SETZM	NSUM
	SETZM FLAGSM
DEXA3:	SETZM	DEXA$L
	CALLR	EXAFIL
	 JRST	DEXA4		; EXIT RETRIEVAL LOOP ON NETWORK EOF
	MOVNI	IO,10
	CAMN	IO,DEXA$L
	 AOJA	FLAG,DEXA4
	SKIPE	FLAGTT
	 CALLR	NETRAT
	AOJA	FLAG,DEXA3
DEXA4:	CALLR	NETC
	MOVE	IO,[ASCII/;I269/]
	CALLR	RENFIP
	 JRST	DEXAE
	CALLR	RENLIN
	CALLR	NETSUM
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	JUMPN	FLAG,RETN(1)
	TSOUT	<[ASCIZ/ (No Such File)/],CRLF>
	RETURN	SKIP,1
DEXAE:	CALLR	D$CON
	ENDR
; EXAMINE -- TERMINAL OUTPUT
;   IN: IO -- COUNT OF CHARACTERS IN BUFFER
;	BP -- BYTE POINTER INTO BUFFER
DEXA$:	BEGINR	<UTIL,FLAG>
	SKIPGE	DEXA$L
	 RETURN
	SETZ	FLAG,
DEXA$1:	SKIPG	IO
	 RETURN
	ILDB	UTIL,BP
	CAIGE	UTIL," "
	 JRST	DEXA$3
DEXA$2:	TBOUT	<UTIL>
	SOJA	IO,DEXA$1
DEXA$3:	CAIE	UTIL,15
	 CAIN	UTIL,11
	  JRST	DEXA$2
	CAIE	UTIL,12
	 CAIN	UTIL,37
	  JRST	DEXA$4
	CAIG	IO,5
	 JUMPE	UTIL,RETN(0)
	PUSH	STAK,UTIL
	MOVEI	UTIL,"↑"
	TBOUT	<UTIL>
	POP	STAK,UTIL
	ADDI	UTIL,100
	TBOUT	<UTIL>
	ADDI	FLAG,1
	CAIE	FLAG,20
	 SOJA	IO,DEXA$1
	JRST	DEXA$5
DEXA$4:	AOS	X1,DEXA$L
	CAML	X1,DEXA$P
	 CAIG	IO,5
	  JRST	DEXA$2
	SUBI	IO,1
	SETZM	DEXA$L
DEXA$5:	SETZ	FLAG,
	TSOUT	<CRLF,[ASCIZ/ More? /]>
DEXA$6:	TBIN1 UTIL
	CAIN	UTIL,15
	 JRST	DEXA$6
	CAIE	UTIL,"Y"
	 CAIN	UTIL,12
	  JRST	DEXA$7
	CAIE	UTIL,175
	 CAIN	UTIL,37
	  JRST	DEXA$7
	CAIN	UTIL," "
	 JRST	DEXA$7
	CAIE	UTIL,"A"
	 CAIN	UTIL,177
	  JRST	DEXA$8
	JRST	DEXA$9
DEXA$7:	TSOUT	<[ASCIZ/Yes/],CRLF>
	JRST	DEXA$1
DEXA$8:	TSOUT	<[ASCIZ/Abort/],CRLF>
	MOVNI	X1,10
	MOVEM	X1,DEXA$L
	RETURN
DEXA$9:	TSOUT	<[ASCIZ/No/],CRLF>
	SETOM	DEXA$L
	ENDR
; DEXP -- EXPUNGE
;
DEXP:	BEGINR	<IO>
	SKIPN	OPENED
	 JRST	DEXP1
	SETZM	OPENED
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
DEXP1:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES"> %INFORMATION/],SEMI>
	CALLR	RENPRE
	CALLR	RENLIN
	CAMN	IO,[ASCII/.I280/]
	 JRST	DEXP2
	TSOUT	<[ASCIZ/ (There are no <FILES>)/],CRLF>
	RETURN
DEXP2:	DCBIN	<IO>
	CAIN	IO," "
	 JRST	DEXP3
	CAIE	IO,12
	 JRST	DEXP2
	DCBIN	<IO>
	CAIN	IO," "
	 JRST	DEXP3
	CALLR	RENLIN
	RETURN
DEXP3:	DCBIN	<IO>
	CAIE	IO,"R"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"E"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"C"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"S"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"="
	 JRST	DEXP2
	CALLR	DCNIN
	CALLR	RENLIN
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
	JUMPN	IO,DEXP4
	DCSOUT	<[ASCIZ/DELETE /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DEXP4:	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	DCSOUT	<[ASCIZ/OPEN /],NBUF,<[ASCIZ/."<FILES">,SYN="<">/]>,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/"<FILES">="<"> WITH STATUS EQ ' '/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JFCL
	DCSOUT	<[ASCIZ/CLOSE "<">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
	SETZM	OPENED
	ENDR
; DGET -- GET-RETRIEVE
;
DGET:	BEGINR	<IO,FLAG>
	SETZ	FLAG,
	SETO	IO,
	CALLR	D$OPEN
	 RETURN
	SKIPLE	VBUF
	 JRST	DGET1
	MOVEI	IO," "
	CALLR	D$VER
	 RETURN
	JRST	DGET2
DGET1:	CALLR	D$VEX
	 RETURN
DGET2:	DCSOUT	<[ASCIZ/"<GET">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT	<SEMI>
	CALLR	NETOI
	 THUD
	MOVE	IO,[ASCII/;I249/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
	SKIPE	FLAGNN
	 JRST	DGET$
	TSOUT	<[ASCIZ/ [Ok]/],CRLF>
DGET$:	SETZM	NSUM
	SETZM FLAGSM
DGET3:	CALLR	GETFIL
	 JRST	DGET4		; EXIT RETRIEVAL LOOP ON NETWORK EOF
	CALLR	LOCNFO
	SETZM	FLAGFE
	CALLR	LOCOO
	 SETOM	FLAGFE
	CALLR	GETDAT
	CALLR	LOCC
	SKIPE	FLAGTT
	 CALLR	NETRAT
	AOJA	FLAG,DGET3
DGET4:	CALLR	NETC
	MOVE	IO,[ASCII/;I269/]
	CALLR	RENFIP
	 JRST	DGETE
	CALLR	RENLIN
	CALLR	NETSUM
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	JUMPN	FLAG,RETN(1)
	TSOUT	<[ASCIZ/ (No Such File)/],CRLF>
	RETURN	SKIP,1
DGETE:	CALLR	D$CON
	ENDR
; FIELD LENGTHS IN WORDS FROM <GET>
	GET$F==SBSIZE		; FILENAME
	GET$E==SBSIZE		; EXTENSION
	GET$D==4		; DATE

; DLIN -- DATACOMPUTER LINK
;
DLIN:	BEGINR	<IO,UTIL,FLAG>
	MOVE	FLAG,FLAGDD
DLINI:	TSOUT	(<[BYTE (7)76,0,0,0,0]>)
	TSIN	(ABUF,SBSIZE,<[BYTE (7)76,0,0,0,0]>)
	 JRST	DLINI
	JUMPE	UTIL,DLINE
	TSOUT	<CRLF>
	SETZM	FLAGDD
	DCSOUT	<ABUF,CRLF>
	SETOM	FLAGDD
	CALLR	RENDER
	 JRST	DLINI
	JRST	DLINI
DLINE:	TSOUT	<[ASCIZ/[Returning]/],CRLF>
	MOVEM	FLAG,FLAGDD
	ENDR
; DLIS -- NODE DIRECTORY
;   IN:  FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DLIS:	BEGINR	<IO,UTIL>
	CAIN	FLAG,DL$T
	 JRST	DLISO1
	CAIN	FLAG,DL$V
	 JRST	DLISO2
	CAIN	FLAG,DL$P
	 JRST	DLISO3
	RETURN
DLISO1:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %NAME/],SEMI>
	JRST	DLISI
DLISO2:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %INFORMATION/],SEMI>
	JRST	DLISI
DLISO3:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIVILEGE/],SEMI>
DLISI:	SETZB	UTIL,GBUF1
	MOVE	X1,[GBUF1,,GBUF1+1]
	BLT	X1,<GBUF1+LBSIZE-1>
	MOVEI	X1,<GBUF2+1>
	MOVEM	X1,GBUF2
	CALLR	RENPRE
	CAMN	IO,[ASCII/.I280/]
	 JRST	DLISD
	CALLR	RENLIP
	JRST	DLISER
DLISN:	DCBIN	<IO>
	CAIE	IO," "
	 JRST	DLISE
	SETO	UTIL,
	SKIPE	FLAGDD
	 JRST	DLISD
	CALLR	<(FLAG)>
	JRST	DLISN
DLISD:	CALLR	RENLIN
	JRST	DLISN
DLISE:	CAIN	IO,"?"
	 JRST	DEATH
	CALLR	RENLIN
	JUMPN	UTIL,DLISER
	TSOUT	<[ASCIZ/ [No Nodes]/],CRLF>
DLISER:	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DL$T -- TERSE NODES
;
DL$T:	BEGINR
	CALLR	DL$NAM
	 JRST	DL$T0
	TSOUT	<CRLF>
DL$T0:	CALLR	RENLIN
	ENDR

; DL$V -- VERBOSE NODES
;
DL$V:	BEGINR	<IO,UTIL,FLAG>
DL$VN:	DCBIN	<IO>
	CAIE	IO,"="
	 JRST	DL$VN
	CALLR	DL$NAM
	 JRST	DL$VE
	TSOUT	<CRLF>
	MOVEI	UTIL,GBUF1
	SKIPE	(UTIL)
	 AOJA	UTIL,.-1
	SUBI	UTIL,GBUF1
DL$VF:	DCBIN	<IO>
	CAIE	IO,"="
	 JRST	DL$VF
	DCBIN	<IO>
	SETZ	FLAG,
	CAIN	IO,"F"
	 MOVEI	FLAG,5
	CAIN	IO,"P"
	 MOVEI	FLAG,1
	CAIN	IO,"N"
	 MOVEI	FLAG,3
	JUMPE	FLAG,DL$VE
	CALLR	RENLIN
DL$VD:	MOVEI	IO,(UTIL)
DL$VD0:	TSOUT	<[ASCIZ/    /]>
	SOJGE	IO,DL$VD0
	MOVEI	IO,"]"
	TBOUT	<IO>
DL$VD1:	DCBIN	<IO>
	TBOUT	<IO>
	CAIE	IO,12
	 JRST	DL$VD1
	SOJG	FLAG,DL$VD
	RETURN
DL$VE:	CALLR	RENLIN
	ENDR

; DL$P -- PROTECTION
;
DL$P:	BEGINR	<IO>
	CALLR	DL$NAM
	 JRST	DL$P1
	TSOUT	<CRLF>
	CALLR	RENLIN
	RETURN
DL$P1:	MOVEI	IO,GBUF1
DL$P2:	SKIPE	(IO)
	 AOJA	IO,DL$P2
	SUBI	IO,GBUF1
DL$P3:	TSOUT	<[ASCIZ/    /]>
	SOJGE	IO,DL$P3
	MOVEI	IO,"]"
	TBOUT	<IO>
DL$P4:	DCBIN	<IO>
	TBOUT	<IO>
	CAIE	IO,12
	 JRST	DL$P4
	ENDR

; DL$NAM -- DIRECTORY: NAME OUTPUT
;   OUT: IO -- LAST CHARACTER INPUT
;
DL$NAM:	BEGINR	<BP,UTIL,FLAG,R10>
	SETZB	R10,FLAG
	MOVE	BP,[440700,,ABUF]
	MOVEI	UTIL,<SBSIZE*5>
	DCBIN	<IO>
	CAILE	IO," "
	 JRST	DL$NA1
	RETURN
DL$NAN:	DCBIN	<IO>
DL$NA1:	CAIN	IO,"."
	 JRST	DL$NIN
	CAIG	IO," "
	 JRST	DL$NA3
	CAIE	IO,42
	 JRST	DL$NA2
	DCBIN	<IO>
DL$NA2:	IDPB	IO,BP
	SOJG	UTIL,DL$NAN
	JRST	DL$NER
DL$NA3:	SETZ	X1,
	IDPB	X1,BP
	TSOUT	<[ASCIZ/  /],ABUF>
	RETURN	SKIP,1
DL$NIN:	MOVE	BP,[440700,,ABUF]
	MOVEI	UTIL,<SBSIZE*5>
DL$NI1:	DCBIN	<IO>
	CAIE	IO,"."
	 CAIG	IO," "
	  JRST	DL$NCN
DL$NI2:	CAIE	IO,42
	 JRST	DL$NI3
	DCBIN	<IO>
DL$NI3:	IDPB	IO,BP
	SOJG	UTIL,DL$NI1
	JRST	DL$NER
DL$NCN:	SETZ	X1,
	IDPB	X1,BP
	SKIPN	X2,GBUF1(FLAG)
	 JRST	DL$NON
	HRLI	X2,440700
	MOVE	X1,[440700,,ABUF]
DL$NC1:	ILDB	X3,X1
	ILDB	X4,X2
	CAIE	X3,(X4)
	 JRST	DL$NON
	JUMPN	X3,DL$NC1
	CAIG	IO," "
	 RETURN	SKIP,1
	AOJA	FLAG,DL$NIN
DL$NON:	CAIL	FLAG,LBSIZE-2
	 JRST	DL$NER
	SETZM	GBUF1+1(FLAG)
	HRL	X1,GBUF1+1(FLAG)
	HRR	X1,GBUF1+2(FLAG)
	BLT	X1,<GBUF1+LBSIZE-1>
	MOVE	X1,[440700,,ABUF]
	SKIPN	X2,GBUF1(FLAG)
	 MOVE	X2,GBUF2
	HRLI	X2,440700
	HRRZI	BP,(BP)
	SUBI	BP,<ABUF-1>
	ADDI	BP,(X2)
	CAIL	BP,<GBUF2+LBSIZE>
	 JRST	DL$NER
	HRRZM	X2,GBUF1(FLAG)
DL$NO1:	ILDB	X3,X1
	IDPB	X3,X2
	JUMPN	X3,DL$NO1
	HRRZI	X2,1(X2)
	MOVEM	X2,GBUF2
	MOVEI	UTIL,(FLAG)
	JUMPE	R10,DL$NO2
	TSOUT	<CRLF>
DL$NO2:	TSOUT	<[ASCIZ/    /]>
	SOJGE	UTIL,DL$NO2
	TSOUT	<ABUF>
	SETO	R10,
	CAIG	IO," "
	 RETURN	SKIP,1
	AOJA	FLAG,DL$NIN
DL$NER:	TSOUT	<[ASCIZ/ (Pathname too long)/],CRLF>
	ENDR
; DPUT -- PUT-STORE
;
DPUT:	BEGINR	<IO>
	CALLR	LOCFFI
	 RETURN
	SKIPN	OPENED
	 JRST	DPUT3
	MOVE	X1,[440700,,OPENED]
	MOVE	X2,[440700,,NBUF]
DPUT1:	ILDB	X3,X1
	ILDB	X4,X2
	CAIE	X3,(X4)
	 JRST	DPUT2
	JUMPN	X3,DPUT1
	MOVEI	X1,1
	CAMN	X1,OPENEM
	 JRST	DPUT5
	DCSOUT	<[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVEI	X1,1
	MOVEM	X1,OPENEM
	JRST	DPUT5
DPUT2:	SETZM	OPENED
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
DPUT3:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	DPUT4
	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,OPENED]
	SCOPY	(X1,X2)
	MOVEI	X1,1
	MOVEM	X1,OPENEM
	JRST	DPUT5
DPUT4:	DCSOUT	<[ASCIZ/CREATE /],NBUF,[ASCIZ/."<FILES"> LIKE %TOP.DFTP."<FILE">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	SKIPE	FLAGNN
	 JRST	DPUT$1
	TSOUT	<[ASCIZ/ [New <FILES>]/],CRLF>
DPUT$1:	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,OPENED]
	SCOPY	(X1,X2)
	SETZM	OPENEM
	DCSOUT	<[ASCIZ/"<FILES">="<TERSE">/],SEMI>
	MOVE	IO,[ASCII/.I231/]
	CALLR	RENFIP
	 RETURN
	MOVEI	IO,"Z"-100
	DCBOUT	<IO>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVEI	X1,1
	MOVEM	X1,OPENEM
	SETZM	VBUF
	JRST	DPUT6
DPUT5:	SETZB	IO,VBUF
	CALLR	D$VER
	 RETURN
DPUT6:	AOS	VBUF
	DCSOUT	<[ASCIZ/"<FILES">="<PUT">/],SEMI>
	CALLR	NETOO
	 THUD
	MOVE	IO,[ASCII/;I239/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
	SKIPE	FLAGNN
	 JRST	DPUT$2
	TSOUT	<[ASCIZ/ [Ok]/],CRLF>
DPUT$2:	SETZM	NSUM
	SETZM FLAGSM
	CALLR	LOCOI
	 THUD
	CALLR	NETFFI
DPUT7:	CALLR	PUTFIL
	CALLR	PUTDAT
	SKIPE	FLAGTT
	 CALLR	NETRAT
	CALLR	LOCNFI
	 JRST	DPUT7
	CALLR	NETC
	MOVE	IO,[ASCII/;I259/]
	CALLR	RENFIP
	 JRST	DPUTE
	CALLR	RENLIN
	CALLR	NETSUM
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN	SKIP,1
DPUTE:	CALLR	D$CON
	ENDR
; DREM -- DELETE NODES
;
DREM:	BEGINR
	SKIPN	OPENED
	 JRST	DREM0
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
	SETZM	OPENED
DREM0:	DCSOUT	<[ASCIZ/DELETE /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JFCL
	DCSOUT	<[ASCIZ/LIST /],CONTEX,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 CAIA
	  RETURN
	TSOUT	<[ASCIZ/ [Connected To Attached Node]/],CRLF>
	MOVE	X1,[ASCII/%LOGI/]
	MOVEM	X1,CONTEX
	MOVE	X1,[ASCII/N/]
	MOVEM	X1,<CONTEX+1>
	ENDR
; DREN -- RENUMBER FILES
;
DREN:	BEGINR	<IO,UTIL>
	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	SETO	IO,
	CALLR	D$VER
	 RETURN
	MOVE	UTIL,VBUF
	MOVE	IO,ABUF
	MOVEM	IO,VBUF
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ DECLARE SAMEVERSION INTEGER/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ SAMEVERSION=0/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ FOR FILES IN "<FILES">/]>
	SETZ	IO,
	CALLR	D$WITH
	DCSOUT	<CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  SAMEVERSION=SAMEVERSION+1/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ IF SAMEVERSION NE 0 THEN ERROR 'VERSION ALREADY EXISTS'/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	CALLR	RENDER
	 RETURN
	MOVEM	UTIL,VBUF
	DCSOUT	<[ASCIZ/BEGIN/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ DECLARE RENUMBERED INTEGER/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ RENUMBERED=0/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ UPDATE FILES IN "<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT	<CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ BEGIN/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  COMMENT FILES.FILE.HEADER.FILENAME/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/   ! '.' ! FILES.FILE.HEADER.EXTENSION/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/    ! ';' ! FILES.FILE.HEADER.VERSION/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  VERSION=/]>
	MOVE	IO,ABUF
	DCNOUT	<IO>
	DCSOUT	<CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  RENUMBERED=RENUMBERED+1/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ END/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ IF RENUMBERED EQ 0 THEN ERROR 'NO SUCH FILE'/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	CALLR	RENDER
	 RETURN
	ENDR
; DUND -- UNDELETE
;
DUND:	BEGINR	<IO>
	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	MOVEI	IO,"D"
	CALLR	D$VER
	 RETURN
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE UNDELETED INTEGER
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	UNDELETED=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	UPDATE FILES IN "<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ 'D'/]
	CALLR	D$WITH
	DCSOUT <[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		STATUS=' '
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		UNDELETED=UNDELETED+1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT FILES.FILE.HEADER.FILENAME
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		  ! '.' ! FILES.FILE.HEADER.EXTENSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		    ! ';' ! FILES.FILE.HEADER.VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF UNDELETED EQ 0 THEN ERROR 'NO SUCH FILE'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END;
/]>
	CALLR	RENDER
	 RETURN
	ENDR
; D$INIT -- INITIALIZE DATACOMPUTER SESSION
;
D$INIT:	BEGINR	<IO,BP,UTIL,FLAG>
	SETZM	FLAGDE
	CALLR	RENDER
	 CAIA
	  JRST	D$IN0
	TSOUT	<[ASCIZ/ ?? Datacomputer initialization failure ??/],CRLF>
	JRST	QUIT
D$IN0:	TSOUT	<[ASCIZ/ [Attaching]/],CRLF>
	MOVE	IO,[440700,,[ASCIZ/%TOP.DFTP.SUAI./]]
	MOVE	BP,[440700,,ABUF]
	SCOPY	(IO,BP)
	GETPPN X1,
	 JFCL
	TRNN X1,770000
	 JRST [	LSH X1,↑D6
		JRST .-1]		; Left Justify SAIL PN's
	HRLZM X1,UBUF1
	SETZM UBUF1+1
	MOVE	X1,[440600,,UBUF1]
	MOVEI	X2,42
D$IN3:	ILDB	X3,X1
	JUMPE	X3,D$IN4
	ADDI	X3,40
	CAIL	X3,"A"
	 CAILE	X3,"Z"
	  IDPB	X2,BP
	IDPB	X3,BP
	JRST	D$IN3
D$IN4:	MOVE	X1,BP
	IDPB	X3,X1
	DCSOUT	<[ASCIZ/LOGIN /],ABUF,SEMI>
	CALLR	RENPRE
	CALLR	RENLIN
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
	CAMN	IO,[ASCII/;O032/]
	 JRST	D$INP
	CAME	IO,[ASCII/+U107/]
	 JRST	D$IND
	MOVEI	FLAG,3
D$IN2:	TSOUT	<[ASCIZ/  [Password:/]>
	TSIN	(UBUF1,LBSIZE,<[ASCIZ/  [Password:/]>,NOECHO)
	 JRST	D$IN2
	TSOUT	<[ASCIZ/]/],CRLF>
	MOVE	X2,BP
	MOVEI	X1,"("
	IDPB	X1,X2
	MOVEI	X1,"'"
	IDPB	X1,X2
	MOVE	X1,[440700,,UBUF1]
	SCOPY	(X1,X2)
	MOVEI	X1,"'"
	IDPB	X1,X2
	MOVEI	X1,")"
	IDPB	X1,X2
	SETZ	X1,
	IDPB	X1,X2
	DCSOUT	<[ASCIZ/LOGIN /],ABUF,SEMI>
	CALLR	RENDER
	 CAIA
	  JRST	D$INP
	TSOUT	<[ASCIZ/   (Incorrect password)/],CRLF>
	SOJG	FLAG,D$IN2
	TSOUT	<[ASCIZ/ [Attaching]/],CRLF>
D$IND:	MOVE	X1,[440700,,[ASCIZ/%TOP.DFTP.DFTP.GUEST/]]
	MOVE	X2,[440700,,ABUF]
	SCOPY	(X1,X2)
	DCSOUT	<[ASCIZ/LOGIN %TOP.DFTP.DFTP.GUEST/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	TSOUT	<[ASCIZ/  (as DFTP.GUEST)/],CRLF>
D$INP:	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<GET"> READ/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<PUT"> WRITE/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<TERSE"> WRITE/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<VERBOSE"> READ/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	MOVE	UTIL,[ASCII/%LOGI/]
	MOVEM	UTIL,CONTEX
	MOVE	UTIL,[ASCII/N/]
	MOVEM	UTIL,<CONTEX+1>
	SETZM	OPENED
	CALLR	D$CON
	ENDR
; D$CON -- CONNECT
;
D$CON:	BEGINR	<UTIL>
	CALLR	NETDSI
	DCSOUT	<[ASCIZ/CONNECT "<GET"> /]>
	DCNOUT	<UTIL>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	CALLR	NETDSO
	DCSOUT	<[ASCIZ/CONNECT "<PUT"> /]>
	DCNOUT	<UTIL>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	ENDR
; D$OPEN -- OPEN PROPER <FILES> IN PROPER MODE
;   IN: IO -- MODE FLAG
;			READ IF < 0
;			WRITE IF = 0
;			APPEND IF > 0
;
D$OPEN:	BEGINR
	SKIPN	OPENED
	 JRST	D$OP05
	MOVE	X1,[440700,,OPENED]
	MOVE	X2,[440700,,NBUF]
D$OP01:	ILDB	X3,X1
	ILDB	X4,X2
	CAIE	X3,(X4)
	 JRST	D$OP05
	JUMPN	X3,D$OP01
	CAMN	IO,OPENEM
	 RETURN	SKIP,1
	JUMPE	IO,D$OP02
	JUMPG	IO,D$OP03
	DCSOUT	<[ASCIZ/MODE "<FILES"> READ/],SEMI>
	JRST	D$OP04
D$OP02:	DCSOUT	<[ASCIZ/MODE "<FILES"> WRITE/],SEMI>
	JRST	D$OP04
D$OP03:	DCSOUT	<[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
D$OP04:	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVEM	IO,OPENEM
	RETURN	SKIP,1
D$OP05:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 CAIA
	  JRST	D$OP06
	TSOUT	<[ASCIZ/ (There are no <FILES>)/],CRLF>
	RETURN
D$OP06:	SKIPN	OPENED
	 JRST	D$OP07
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
	SETZM	OPENED
D$OP07:	JUMPE	IO,D$OP08
	JUMPG	IO,D$OP09
	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> READ/],SEMI>
	JRST	D$OP10
D$OP08:	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> WRITE/],SEMI>
	JRST	D$OP10
D$OP09:	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
D$OP10:	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,OPENED]
	SCOPY	(X1,X2)
	MOVEM	IO,OPENEM
	ENDR	SKIP,1
; D$VER -- PRODUCE PROPER VERSION NUMBER
;   IN: IO -- DEFAULT FLAG
;			SMALLEST UNDELETED VERSION IF < 0
;			LARGEST VERSION IF = 0
;			LARGEST DELETED VERSION IF = "D"
;			LARGEST UNDELETED VERSION IF = " "
;   OUT: IO -- VERSION (IF DEFAULT)
;
D$VER:	BEGINR	<UTIL>
	SKIPE	VBUF
	 RETURN	SKIP,1
	JUMPE	IO,D$VER1
	LDB	UTIL,[350700,,FBUF]
	CAIN	UTIL,"*"
	 SETOM	VBUF
	LDB	UTIL,[350700,,EBUF]
	CAIN	UTIL,"*"
	 SETOM	VBUF
	SKIPE	VBUF
	 RETURN	SKIP,1
	JUMPG	IO,D$VER2
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE LEAST INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	LEAST=-1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	      AND (STATUS EQ ' ')/],[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		IF LEAST EQ -1 THEN LEAST=VERSION ELSE
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/			IF LEAST GT VERSION THEN LEAST=VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF LEAST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT '}' ! LEAST
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	JRST	D$VERE
D$VER1:	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE GREATEST INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	GREATEST=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">/]>
	CALLR	D$WITH
	DCSOUT	<[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		IF GREATEST LT VERSION THEN GREATEST=VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	COMMENT '}' ! GREATEST
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	JRST	D$VERE
D$VER2:	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE GREATEST INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	GREATEST=-1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	      AND (STATUS EQ '/]>
	DCBOUT	<IO>
	SKIPN	FLAGDD
	 JRST	D$VER$
	TBOUT	<IO>
D$VER$:	DCSOUT	<[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		IF GREATEST LT VERSION THEN GREATEST=VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF GREATEST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT '}' ! GREATEST
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
D$VERE:	MOVE	IO,[ASCII/;A282/]
	CALLR	RENFIP
	 RETURN
D$VERN:	DCBIN	<IO>
	CAIE	IO,"}"
	 JRST	D$VERN
	CALLR	DCNIN
	MOVEM	IO,VBUF
	CALLR	RENLIN
	CALLR	RENDER
	 RETURN
	ENDR	SKIP,1
; D$VEX -- VERIFY THAT VERSION EXISTS
;
D$VEX:	BEGINR	<IO>
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE EXTANT INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	EXTANT=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	      AND (VERSION EQ /]>
	MOVE	IO,VBUF
	DCNOUT	<IO>
	DCSOUT	<RPAREN>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		AND (STATUS EQ ' ')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/			EXTANT=EXTANT+1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF EXTANT NE 1 THEN ERROR 'NO SUCH FILE'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	CALLR	RENDER
	 RETURN
	ENDR	SKIP,1
; D$WITH -- GENERATE A QUALIFIED WITH CLAUSE (CONSIDER *'S)
;   IN: IO -- POINTER TO FIXED QUALIFIER (OR 0)
;   FLAGS:
	D$W$F==400000
	D$W$E==200000
	D$W$V==100000
	D$W$Q==010000
;
D$WITH:	BEGINR	<UTIL,FLAG>
	SETZ	FLAG,
	LDB	UTIL,[350700,,FBUF]
	CAIE	UTIL,"*"
	 TRO	FLAG,D$W$F
	LDB	UTIL,[350700,,EBUF]
	CAIE	UTIL,"*"
	 TRO	FLAG,D$W$E
	SKIPLE	VBUF
	 TRO	FLAG,D$W$V
	SKIPE	IO
	 TRO	FLAG,D$W$Q
	JUMPE	FLAG,RETN(0)
	DCSOUT	<[ASCIZ/ WITH/]>
	TRNN	FLAG,D$W$F
	 JRST	D$WIT1
	DCSOUT	<[ASCIZ/ FILENAME EQ '/],FBUF,[ASCIZ/'/]>
	TRNN	FLAG,D$W$E!D$W$V!D$W$Q
	 RETURN
	DCSOUT	<[ASCIZ/ AND/]>
D$WIT1:	TRNN	FLAG,D$W$E
	 JRST	D$WIT2
	DCSOUT	<[ASCIZ/ EXTENSION EQ '/],EBUF,[ASCIZ/'/]>
	TRNN	FLAG,D$W$V!D$W$Q
	 RETURN
	DCSOUT	<[ASCIZ/ AND/]>
D$WIT2:	TRNN	FLAG,D$W$V
	 JRST	D$WIT3
	DCSOUT	<[ASCIZ/ VERSION EQ /]>
	MOVE	UTIL,VBUF
	DCNOUT	<UTIL>
	TRNN	FLAG,D$W$Q
	 RETURN
	DCSOUT	<[ASCIZ/ AND/]>
D$WIT3:	TRNN	FLAG,D$W$Q
	 RETURN
	DCSOUT	<(IO)>
	ENDR
; NETSUM -- NETWORK CHECKSUM VERIFICATION
;
NETSUM:	BEGINR	<IO,FLAG>
	CALLR	RENPRE
	CAME	IO,[ASCII/;I275/]
	 JRST	NETS2
	SETZ	FLAG,
NETS1:	DCBIN	<IO>
	CAIE	IO,"="
	 JRST	NETS1
	SKIPN	FLAG
	 SOJA	FLAG,NETS1
	CALLR	DCNIN
	CAME	IO,NSUM
	 JRST	NETS3
	CALLR	RENLIN
	RETURN
NETS2:	CALLR	RENLIP
	RETURN
NETS3:	CALLR	RENLIN
	TSOUT	<[ASCIZ/ (Network Checksum Error)/],CRLF>
	ENDR

; NETRAT -- CALCULATE AND PRINT RATE
;
NETRAT:	BEGINR	<IO,<IO+1>>
	TSOUT	<[ASCIZ/ (/]>
	MOVEI	IO,↑D36
	IMULB	IO,NSIZE
	IDIV	IO,NTIME
	TNOUT	<IO>
	TSOUT	<[ASCIZ/ Baud (/]>
	MOVE	IO,NSIZE
	TNOUT	<IO>
	TSOUT	<[ASCIZ/ bits in /]>
	SKIPN	IO,NTIME
	 MOVEI	IO,1
	TNOUT	<IO>
	HRRZI	<IO+1>,[ASCIZ/ seconds))/]
	CAIN	IO,1
	 HRRZI	<IO+1>,[ASCIZ/ second))/]
	TSOUT	<(IO+1),CRLF>
	ENDR
; RENDER -- REQUEST ENDER (ASSUMES INITIAL RENLIN)
;
RENDER:	BEGINR	<IO,UTIL,FLAG>
	SETZ	FLAG,
RENDSL:	CALLR	RENPRE
	CAMN	IO,[ASCII/.I220/]
	 JRST	RENDES
	CAMN	IO,[ASCII/.I210/]
	 JRST	RENDRR
	CAME	IO,[ASCII/;A282/]
	 CAMN	IO,[ASCII/.J151/]
	  JRST	RENDPM
	LDB	UTIL,[350700,,IO]
	CAIE	UTIL,"+"
	 CAIN	UTIL,"-"
	  CAIA
	   JRST	RENDFL
	SETO	FLAG,
	SKIPN	FLAGDE
	 JRST	RENDFL
	SETZM	FLAGDE
RENDPM:	CALLR	RENLIP
	JRST	RENDSL
RENDFL:	CALLR	RENLIN
	JRST	RENDSL
RENDES:	CALLR	RENLIN
	MOVEI	IO,"L"-100
	DCBOUT	<IO>
	SETO	FLAG,
	JRST	RENDSL
RENDRR:	CALLR	RENLIN
	JUMPN	FLAG,RETN(0)
	ENDR	SKIP,1

; RENFIP -- FIND PREFIX (ASSUMES INITIAL RENLIN)
;   IN: IO -- PREFIX
;
RENFIP:	BEGINR	<BP,UTIL,FLAG>
	MOVE	FLAG,IO
	SETZ	UTIL,
RENFIL:	CALLR	RENPRE
	CAMN	IO,FLAG
	 RETURN	SKIP,1
	LDB	BP,[350700,,IO]
	CAIE	BP,";"
	 CAIN	BP,"."
	  JRST	RENFIN
	SKIPN	UTIL
	 CALLR	RENLIP
	SKIPE	UTIL
	 CALLR	RENLIN
	AOJA	UTIL,RENFIL
RENFIN:	CALLR	RENLIN
	CAMN	IO,[ASCII/.I220/]
	 JRST	RENFIS
	CAMN	IO,[ASCII/.I210/]
	 RETURN
	JRST	RENFIL
RENFIS:	MOVEI	IO,"L"-100
	DCBOUT	<IO>
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; RENLIN -- REQUEST END: PROCEED TO NEW LINE
;
RENLIN:	BEGINR	<IO>
RENLNL:	DCBIN	<IO>
	CAIE	IO,12
	 JRST	RENLNL
	ENDR

; RENLIP -- REQUEST END: PROCEED TO NEW LINE, PRINT MESSAGE
;
RENLIP:	BEGINR	<IO>
	SKIPN	FLAGDD
	 JRST	RENLPF
RENLPL:	DCBIN	<IO>
	CAIE	IO,12
	 JRST	RENLPL
	RETURN
RENLPF:	DCBIN	<IO>
	CAIN	IO,12
	 RETURN
	CAIE	IO,11
	 JRST	RENLPF
	MOVEI	IO," "
	TBOUT	<IO>
	MOVEI	IO,"("
RENLPP:	TBOUT	<IO>
RENLPQ:	DCBIN	<IO>
	CAIN	IO,42
	 JRST	RENLPQ
	CAIE	IO,15
	 JRST	RENLPP
	DCBIN	<IO>
	MOVEI	IO,")"
	TBOUT	<IO>
	TSOUT	<CRLF>
	ENDR

; RENPRE -- REQUEST END: RETURN ERROR PREFIX (ASSUMES RENLIN)
;   OUT: IO -- ASCII PREFIX (5 BYTES)
;
RENPRE:	BEGINR	<BP,UTIL,FLAG>
RENPRP:	SETZ	IO,
	MOVE	BP,[440700,,IO]
	MOVEI	FLAG,5
RENPRL:	DCBIN	<UTIL>
	CAIE	UTIL,15
	 CAIN	UTIL,12
	  JRST	RENPRL
	IDPB	UTIL,BP
	SOJG	FLAG,RENPRL
	LDB	UTIL,[350700,,IO]
	CAIN	UTIL,"?"
	 JRST	DEATH
	CAIE	UTIL,"!"
	 RETURN
	SKIPN	FLAGNN
	 CALLR	RENLIP
	JRST	RENPRP
	ENDR

; DEATH -- FATAL DATACOMPUTER ERROR (? MESSAGE)
;
DEATH:	CALLR	RENLIP
	TSOUT	<[ASCIZ/ ?? Fatal Datacomputer Error ??/],CRLF>
	EXIT
; TAIN -- TERMINAL AUTHORIZATION INPUT
;   IN: X1 -- POINTER TO CONFIRMATION MESSAGE
;
$TAIN$:	BEGINR	<IO>
TAIN1:	MOVEI	IO,(X1)
	TSOUT	<(IO)>
TAIN5:	TBIN1 IO
	CAIN	IO,15
	 JRST	TAIN5
	CAIN	IO,"R"-100
	 JRST	TAIN1
	CAIN	IO,"N"
	 JRST	TAIN2
	CAIN	IO,"Y"
	 JRST	TAIN3
	CAIE	IO,12
	 CAIN	IO,175
	  JRST	TAIN4
	CAIE	IO,37
	 CAIN	IO," "
	  JRST	TAIN4
	TSOUT	<[ASCIZ/XXX/],CRLF>
	RETURN
TAIN2:	TSOUT	<[ASCIZ/No/],CRLF>
	RETURN	SKIP,1
TAIN3:	TSOUT	<[ASCIZ/Yes/]>
TAIN4:	TSOUT	<CRLF>
	ENDR	SKIP,2
; TERMINAL COMMAND INPUT ROUTINE
;
;   WHEN ENOUGH OF A COMMAND IS RECEIVED TO UNIQUELY IDENTIFY IT,
;     INPUT NOT CONFORMING TO THE REST OF THE COMMAND IS NOT ACCEPTED.
;   IF THE COMMAND IS UNIQUELY IDENTIFIED, AN ALTMODE, CARRIAGE RETURN,
;     LINE FEED, EOL, OR SPACE WILL FINISH IT.
;     IF NOT, SUCH CHARACTERS WILL BE REJECTED.
;   ↑A AND RUBOUT DELETE THE LAST CHARACTER, ↑R RETYPES THE INPUT LINE,
;     ↑X AND ↑U DELETE THE LINE (RETURN TCIO=-1).
;
;	IN: TCIO -- POINTER TO ↑R TEXT,,POINTER TO CONTROL BLOCK
;			POINTER TO COMMAND STRING LIST
;			NUMBER OF COMMANDS
;			NUMBER OF CHARACTERS IN LARGEST COMMAND STRING
;			NUMBER OF WORDS IN LARGEST COMMAND STRING
;			<VALUE LIST>
;			<COMMAND STRING LIST>
;	OUT: TCIO -- LAST CHAR INPUT
;	     FLAG -- COMMAND VALUE
;	RETURNS: SKIP,0 -- DELETE LINE
;		 SKIP,1 -- NULL COMMAND
;		 SKIP,2 -- COMMAND RECOGNIZED
;
$TCIN$:	BEGINR	<TCIBP,TCIACB,TCITLP,TCITCC,TCIPBP,TCIPCC,TCISBP,TCISCC,TCIMAC,TCIMAN,UTIL>
	MOVE	TCIACB,TCIO
	SETZ	UTIL,
TCII01:	MOVEM	UTIL,TCIPCL(UTIL)
	ADDI	UTIL,1
	CAME	UTIL,1(TCIACB)
	 JRST	TCII01
	ADDI	UTIL,TCIPCL
	MOVEM	UTIL,TCIPNF
	HRRI	UTIL,TCIPCL
	HRL	UTIL,1(TCIACB)
	MOVEM	UTIL,TCIPLP
	MOVE	TCIBP,[440700,,ABUF]
	HRLI	TCISBP,350700
	HRR	TCISBP,(TCIACB)
	SETZ	TCISCC,
TCICHR:	TBIN	<TCIO>
	CAIN	TCIO,"R"-100
	 JRST	TCIREP
	CAIN	TCIO,"?"
	 JRST	TCIQUA
	CAIE	TCIO,177
	 CAIN	TCIO,"A"-100
	  JRST	TCIDEL
	CAIE	TCIO,"U"-100
	 CAIN	TCIO,"X"-100
	  JRST	TCIENR
	CAIN	TCIO,15
	 JRST	TCICHR
	CAIE	TCIO,12
	 CAIN	TCIO,37
	  JRST	TCIC01
	CAIE	TCIO," "
	 CAIN∪Qπ∪≡XDnj~∀$@A∃%M(∪)π%ε`b~(∪πβ∪≤∪)π∪<XD@D4∀∩A∃I'(∪)
∪¬βλ4∀∪∃%M(∪)π%ε`d~))π∪ε@bt∪∃U≠!
∪Qπ∪'πY)π∪∃≥≤~∀%⊃→%4%+)∪_1)π∪!1 Q)π%'πεR4∀∪πβ%≤∪+)%_Xb∩$vA∨⊗↓∪A∃U'(A∨9
A!∨M'∪¬∪1∪)2~(∩A∃%M(∪)π%≥λ~))π∪ε@dt∪'∃)4∪)
∪!πε0~∀∪≠=-
∪)
∪!¬ 1)π∪'	 ~∀∪5∨-
∪U)∪_YQπ∪!≥_~∀∪≠=-~∪U)∪_Xq)π∪!1 Vb|!)π∪'
εR~∀%')4%)π∪≠¬εX~∀%⊃%%5$∪)π∪5β≤XZD~∃)π%ε`ft%→	∧∪U)∪_YQπ∪!¬@~∀∪∃U≠!
∪U)∪_YQπ∪ε`P~∀∪π¬∪
∪+Q∪_XQQπ∪≡R4∀∩A∃I'(∪)
∪ε`p4∃)π∪`ht∪!→%4∪Qπ∪)πY)π∪A→ Q)
∪'πε$~∀∪⊃I%4∪)
∪)→ 1)π∪!1 Q)π%'πεR4∃)π∪`jt∪5∨-
∪U)∪_X!)π∪)1 R~∀%πβ∪≤%+)∪_0Q)π∪AπεR~(∩A∃%M(∪)π%ε`l~(∪β∨∀%)π∪)1 X~∀%'∨∃∞%)π∪)
εY)π%ε`j~(∪∃%'P∪)π∪`p~∃Qπ∪ε`Xt∪→	λ∪+)∪0Y)π∪A¬ ~∀%∃+≠!∀∪+)∪0Y)π∪`n~∀%≠∨-4∪)π∪AπεY↓Qπ∪!≥_~∀∪β=&∪)π%!≥~(∪β∨∃∧∪)π∪5βεY)
∪ε`p4∃)π∪`nt∪
β∪≤∪Qπ∪≠β8XZb~(∩A'Q≡∪)π%≠β≤X4∀∪πβ%
∪)π%≠β≤X4b~∀∩↓⊃%%5$∪)π∪5β≤XQQπ∪!πR~∃)
∪ε`ph∪β	λ%)π∪!	 XfQQπ∪βπλR~∀∪¬∨∀∪)
∪!πε0~∀∪π¬≠
∪)
∪!πε0bQ)π%βπ∧R4∀∩A∃I'(∪)
∪ε`f4∀∪πβ%
∪)π%≡Xbd4∀∩Aπ¬∪≤∪)
∪≡Xf\~∀∩@↓∃%'(%)π∪ε@r~∀∪
β∪≤∪Qπ∪≡Xλ@D~∀$A∃%'P∪)π∪`r~∀%πβ∪
%)π∪≡0bnj~(∩A∃%M(∪)π%εb`~))π∪ε@rt∪∃U≠!_∪Qπ∪≠β8Y)π∪	βλ~∀%πβ∪≤%)π∪≠¬≤XZb4∀∩A∃I'(∪)
∪¬βλ4∀∪∃%M(∪)π%≥λ~))π∪εD`t∪∃U≠!
∪Qπ∪≠βY)π∪	βλ~∀%β∨∀∪Qπ∪'πX~∀∪!%→~∪Qπ∪≠βY)π∪A→ Q)
∪'πε$~∀∪∪	 ∪)π%'¬ ~(∪∪	!λ∪)π∪<Y)π∪	 ~∀∪Q¬∨+($y)π∪<|∩∩v↓π⊃≡4∀∪∃%M(∪)π%π⊃$~))π∪¬¬λt∪≠=-∩∪Qπ∪≡X	∞DZb@`~∀∪Q¬∨+($y)π∪<|~∀∪)%'(∪Qπ∪π⊃H~∃)π%% t%)'∨+P∩yπ%1|~∀%⊃→%4%+)∪_1)π∪β
∧~∀∪Q'∨+($xQ+)%_R|~(∪⊃%%i∩∪)π%!πεX!)π∪'
εR∩v↓∨+)!U(A→∨= Aπ∨9)%∨_zAπ⊃¬%&A'<A
β$4∀∪≠∨Y
∪)π%!¬ Ylhh`n@`XYβ	+
:~))π∪$@bt∪'=∃_∪)
∪!πε1)π∪π!$~∀∪%→	∧∪Qπ∪≡YQπ∪!¬@~∀∪)	∨+(∩q)π∪≡x~∀∪∃I'(∪)
∪$`b4∃)π∪E+αt∪Q¬∨+($y)π∪<|∩∩v↓!%∪≥P@D}D4∀∪⊃→I4∪)π%!πεYQπ∪!→@Q)π∪MπεR@lA!%∪9(A)⊃∀A!∨'M∪¬→
↓π∨≠≠¬≥λA→%'(~∀%⊃%%4%)π∪!	 Y)π%!→ QQπ∪'πR~∃)
∪"`bh∪)'∨U(∩yπI→|~(∪≠∨-∃∩∪)π%≡Xbb4∀∪)¬=+(∩yQπ∪≡|4∀∪≠∨Y
∪)π%)πεXHQ)π∪¬π∧R~(∪≠∨-∀∪)π∪Q→ XQQπ∪!¬@R~∀∪%≠+_∪Qπ∪)→@XfQ)
∪βπ∧$~∀∪β⊃λ∪)π%)→ X!)π∪β
∧R~∀%⊃%→∩%)π∪)1 Xhh@n``~))π∪"@dt∪∪1	∧∪)
∪≡Y)
∪)→ 4∀∪∃+5!
∪)
∪≡Y)
∪"`f4∀∪)¬=+(∩yQπ∪≡|4∀∪'∨)∞∪)π%)πεYQπ∪"`H~∃)π%"`ft%β∨∀∪Qπ∪!¬@X~∀∪M∨∃∞∪Qπ∪!πY)π∪D`b~∀%∃%'(%)π∪%∃ ~∃)
∪	_h∪∃+≠A→
∪)
∪'πε1)π∪9$∩vAQ⊃%
≥&A≥≡↓π⊃β%¬π)$↓)≡A	∃→)
4∀∪≠∨Y∩∪)
∪≡XEpD~∀∪Q¬∨+($y)π∪<|~∀∪1	∧∪)
∪≡Y)
∪¬ ~(∪)¬∨U(∩y)
∪≡|~(∪β	λ↓)π∪¬@Y6`n@```X0a:∩∩lA¬βπ,A+ A1∪≥
A	3)
AA)$~∀%)→≥
↓)π∪¬@Xh``@``~∀$A'+∧↓)π∪¬@Y6hf@```X0c:~∀%⊃%%4%+)∪_1)π∪!1 Q)π%'πεRvA%M(A)
∪!≥4∀∪≠∨Y~∪+Q∪_Y)
∪!≥4∀∪β	⊂A)π∪M¬ Y6@n```@XXa:$∩vA¬¬π⊗A+@A'πβ8A¬3)∀A!)$4∀∪)→9
A)π%'¬ XP````@~∀∩AM+∧A)
∪'¬ 16hf`@``XXE:~∀∪M∨∃α∪Qπ∪'πY)π∪
⊃$~∃Qπ∪≥Ht∪)'=+(∩ymβ'π∪h←110=:Yπ%1|~∀%')4%
→β∞0~∀∪%∃)+%≤4∃)π∪∃≥≤t∪M)4∪→→β∞X4∀∪%Q+%≤∪M↔∪ XD~∃)π%≥λt%≠∨-
%)π∪)1 Y)π%!→ QQπ∪'πR@vA
∨≠≠β9λA≥+5¬$~(∪≠∨-∀∪)π∪Q→ XQQπ∪)→@R~∀∪%≠+_∪Qπ∪)→@XfQ)
∪βπ∧$~∀∪β⊃λ∪)π%)→ X!)π∪β
∧R~∀%⊃%→∩%)π∪)1 Xhh@n``~(∪')h∪)π∪QπεX~))π∪
@bt∪∪	 ∪)π%)→ ~(∪β∨∀%)π∪)
εX~∀%πβ∪
%)π∪)
εXQ)
∪'πε$~∀∩A)%'(∪Qπ∪
`D~∃)π%
`dt%β∨∀∪Qπ∪)πX~∀∪
β≠→
%)π∪)
εXdQQπ∪βπλR~∀∩↓∃%'(%)π∪
@f~∀∪%→	∧∪Qπ∪≠βY)π∪Q→ ~∀%∃+≠!∀∪)π∪5βεY)
∪
`f4∀∪)¬=+(∩yQπ∪≠β|~∀∪)%'(∪Qπ∪
`H~∃)π%
`ft%≠∨-
%)π∪)1 Y)π%!→ QQπ∪'πR~∀∪5∨-
∪→→β∞X!)π∪)1 R~∀%β		∩%
→β∞0hQ)π%βπ∧R4∀∪≠∨Y
∪
→¬∞XQ
1β∞R~(∪≥	H∪'↔∪@Xd~∀_vA)∃%≠∪≥¬_A')I∪≥∞A%≥!+(4∀v@@↓∪≤tA%≡@ZZ↓!∨∪≥Q$A)<A¬+
→$XYM∪5
A=A¬+→
$~(v∪+)%_@ZZ↓π⊃≡↓
→β∞P`A∪_Aπ⊃<RXY!=∪≥)HA)≡Ay$A)a(~∀v@A∨+PtA∪≡ZZA→¬'(Aπ!β%βπQ$A∪9!+(@ ZbA∪_A	→∃)
A→%≥
R~(v@@@@@@AU)∪_@4ZAπ∨U≥(A∨_Aπ⊃βIβπ)I&~∀v4∀I)'%≤Ht∪	∂∪≥H∩y¬ 1$b`YHbbY$Dd|~∀%≠∨-
%$b`Y%≡~∀∪5∨-
∪HbbY+Q∪_~∀%⊃→%4%¬ Y∪<~∀∪⊃I→∩∪¬@Xhh`\``~∀%')4%+)∪_0~∃)'%π⊃$t%)¬∪≤$y∪≡|4∀∪πβ%≤∪∪≡0E$DZD``~∀$A∃%'P∪)'∪I ~∀%πβ∪
%∪≡Xb\n~∀∩↓πβ∪≤%∪≡XE∧DZb`@~∀∩@↓∃%'(%)'∪	∃_~∀∪
β∪
∪%≡XE*λZb``4∀∩Aπ¬∪≤∪∪<XE0D4b``~(∩@A∃I'(∪)M∪≥$4∀∪πβ%≤∪∪≡0bj~∀$A∃%'P∪)'∪
⊃$~∀%πβ∪
%∪≡XbH~∀∩A
β∪≤∪%≡XbnT~∀∩@↓∃%'(%)'∪9λ~∀∪
β∪≤∪%≡Xfn4∀∩A∃I'(∪)M∪≥λ4∀∪πβ%_∪∪≡0D@D~(∩Aπβ%_∪+)%_XQ$D`R~∀$@A∃%M(∪)'%¬βλ~(∪∪	!λ∪∪≡Y	 ~∀∪¬		∩∪U)∪_XD~∀∪∃U≠!_∪HbbY)M∪π⊃$4∀∪)¬=+(∩y%≡|~∀%∃%'(%)'∪π!$~∃)M∪¬βλh∪≠∨-∃∩∪∪≡0E∞DZD``~∀%)¬∨+P∩y∪≡x~∀∪∃I'(∪)M∪π⊃$4∃)'∪I t∪Q'∨+($yπ%→_|~∀∪Q'∨+($xQ$bDR|~∀%∃+≠!0∪$bb1)'∪π!$~∀∪!%%5∩%∪≡XQ	 R~∀%⊃→$∪HbdY$D`~∀∪
β∪∂
%∪≡XQHbdR~(∩A∃%M(∪)'%π⊃$~(∪⊃%→$∪$bd0hh`n@`~∃)M∪$`bh∪πβ≠8∪$bd1¬ ~∀$A∃%'P∪)'∪
⊃$~∀%∪→	∧%∪≡Y$Dd~∀∪Q¬∨+($y∪≡|4∀∪∃%M(∪)'%$`b~))'∪	∃_t∪∃U≠!
∪U)∪_YQ'∪≥H~∀∪≠=-∩∪%≡XE8λ~∀∪)	∨+(∩q∪≡|~(∪→	∧%∪≡Y¬@~∀∪β⊃λA¬ 16n``@`XXat~∀∪)1≥
A¬@Xh``@``~∀$A'+∧↓¬ Y6Pf```@XXc:4∀∪'+	∩∪+)%_Xb~(∪∃+≠A_∪$bDY)'∪
⊃$~∀%)¬∨+P∩y∪≡x~∀∪∃I'(∪)M∪π⊃$4∃)'∪∃≥$t∪Q'∨+($y7β'
∪4←1a0←:Y
%→|4∀∪'Q≡∪∪≡0~∀∪'∃)4∪+Q∪_X~(∪%)U%≤~∃Q'∪≥⊂t∪'Q4∪$bHX~∀∪%	!∧∪HbdY¬@~∀∪9	$∪'-∪ Xb4∀_vA)∃%≠∪≥¬_A≥+5¬$A%≥!+(4∀v@@↓∪≤tA%≡@ZZ↓!∨∪≥Q$A)<A=$AQ1(X1%β	∪`~∀v@A∨+(hA∪≡@4ZA≥+5¬$~(v~∀IQ≥∪≤Hh∪¬∂%≥$∩y	 Y+)%_Y
→¬∞|~∀%≠∨-
%+)∪_1∪≡~∀%≠∨-
%¬ Y6Ph`n`@XY+¬Uc:~(∪')h∪
→β≤X~∃)9∪π⊃$h∪)¬∪8∩y∪≡x~∀∪π¬∪≤∪∪<XE$D4b``~(∩A∃%M(∪)≥%% ~(∪πβ∪∀∪∪≡XDnn~∀$Aπβ∪8∪∪≡X	αDZb@`~∀∩A∃%'P∪)≥∪⊃_~∀%πβ∪
%∪≡XETDZb`@~∀∩A
β∪≤∪%≡XE0λZb``4∀∩@A)%'(∪Q≥∪≥H~∀∪π¬∪≤∪∪<Xbj~(∩A∃%M(∪)≥%π⊃$~(∪πβ∪∀∪∪≡XDd~∀∩↓πβ∪≤%∪≡Xb\j~∀∩A∃%'P∪)≥∪∃≥λ~∀%πβ∪
%∪≡Xf\~∀∩A
β∪≤∪%≡XD@λ~∀∩@↓∃%'(%)≥∪9λ~∀∪
β∪_∪%≡XD`λ~∀∩A
β∪_∪%≡XD`λQ+)∪0R~∀∩A∃%'P∪)≥∪	βλ~∀%πβ∪→∀∪
→β≤Xbd∩$vA≠βa∪≠+~FA∨↓	∪∂∪Q&A/∪Q⊃∨+(↓∨-%→→∨.~(∩A∃%M(∪)≥%¬βλ~(∪∪	!λ∪∪≡Y	 ~∀∪Q¬∨+($y∪≡|4∀∪β∨)α∪
→¬∞Y)≥%π⊃$~))≥∪¬¬λt∪≠=-∩∪%≡XE∞λZb``4∀∪)¬=+(∩y%≡|~∀%∃%'(%)≥∪π!$~∃)9∪% h∪)'∨U(∩yπI→|~(∪⊃→%h∪∪≡YU)∪_~(∪)'∨U(∩xQ%≡R|~(∪⊃%%i∩∪∪≡0Q¬ R4∀∪πβ%∂
∪∪<Y+¬+_b~∀∩↓∃%'(%)≥∪π!$~∀∪5∨-
∪%≡Y6hP`n``0Y+¬+_c:~∃Q≥∪$`Dt∪πβ5≤∪∪≡1¬ ~∀$A∃%'P∪)≥∪
⊃$~∀%∪→	∧%0bY∪<~∀∪)	∨+(∩q0b|~(∪∃%'P∪)≥∪H`b~∃Q≥∪	0t∪∃+5!
∪
1β∞Y)9∪≥$4∀∪≠∨Y∩∪∪<XE8D4∀∪)¬=+(∩y%≡|~∀%→	∧∪%≡Y¬ 4∀∪β	⊂A¬ Yln```@XXa:4∀∪)→9
A¬ 0h```@`~∀∩↓'+∧A	 Y6hL````0Xc:~(∪)¬∨U(∩y∪<|~∀∪M∨∃α∪→→β∞YQ≥∪π⊃H~∃)≥%≥$t%)'∨+P∩y7βMπ∪4←a10←:1π%→x~∀∪'∃)4∪∪<X~∀∪I)+%8~∃)≥%≥λt%')4%∪≡X~(∪∪	!λ∪∪≡Y	 ~∀∪5∨-
∪	 Y6hP`n``0Y+¬+_c:~∀%≠∨-$∪
→β≤XQ+)%_R~∃Q≥∪πβ0t∪∪→⊃∧∪+)%_Y¬ 4∀∪∃+5!
∪+Q∪_Y%∃)≤Pb$~∀∪∪5+→∩∪%≡XQ
1β∞R~(∪'+¬$∪+)∪0XD`D4∀∪β	⊃∩∪∪≡0Q+)∪0R~∀∪)%'(∪Q≥∪πβ0~∀∪9	$~∀_vA	
≥∪≤@4ZA	βQβπ∨≠A+)$↓≥+≠¬∃$A∪≥A+(~∀l@@A∨U(tA∪<@ZZ@6-BIT MAGNITUDE INTEGER
;
DCNIN:	BEGINR	<<IO+1>,UTIL>
	SETZ	IO,
DCNIN1:	DCBIN	<UTIL>
	CAIL	UTIL,"0"
	 CAILE	UTIL,"9"
	  RETURN
	JUMPL	IO,DCNIN2
	MULI	IO,↑D10
	CAILE	IO,1
	 JRST	DCNIN2
	CAIN	IO,1
	 TLO	<IO+1>,400000
	MOVE	IO,<IO+1>
	ADDI	IO,-"0"(UTIL)
	JRST	DCNIN1
DCNIN2:	SETO	IO,
	JRST	DCNIN1
	ENDR
; $NOUT$ -- INTEGER OUTPUT
;   IN: X1 -- INTEGER
;       X2 -- T-DC FLAG (0=T,-1=DC),,RADIX
;
$NOUT$:	BEGINR	<FLAG>
	MOVE	FLAG,X2
	MOVE	X3,[440700,,UBUF1]
	MOVEI	X4,1
	JUMPGE	X1,NOUT1
	LSHC	X1,-↑D35
	LSH	X2,-1
	DIVI	X1,(FLAG)
	CAIA
NOUT1:	 IDIVI	X1,(FLAG)
	ADDI	X2,"0"
	IDPB	X2,X3
	SKIPE	X1
	 AOJA	X4,NOUT1
	SKIPA	X1,[440700,,UBUF2]
NOUT2:	ADD	X3,[070000,,0]
	TLNE	X3,400000
	 SUB	X3,[430000,,1]
	LDB	X2,X3
	IDPB	X2,X1
	SOJG	X4,NOUT2
	IDPB	X4,X1
	SKIPL	FLAG
	 JRST	NOUT3
	DCSOUT	<UBUF2>
	RETURN
NOUT3:	TSOUT	<UBUF2>
	ENDR
; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL:	BEGINR	<IO,UTIL>
	MSTIME	X1,
	IDIVI	X1,↑D1000
	MOVEM	X1,NTIME
	MOVE	IO,[-GET$F,,FBUF]
	CALLR	NUTFB
	 RETURN
	MOVEI	IO,GET$F
	MOVEM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<FBUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[GET$E,,EBUF]
	CALLR	NUTFB
	MOVEI	IO,GET$E
	ADDM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<EBUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[GET$D,,ABUF]
	CALLR	NUTFB
	MOVEI	IO,GET$D
	ADDM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<ABUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[440700,,ABUF]
	CALLR	LUTTSN
	DPB	IO,[001400,,LFILE+2]
	LSH	IO,-14
	DPB	IO,[170300,,LFILE+1]
	DPB	UTIL,[141300,,LFILE+2]
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	AOS	NSIZE
	MOVE	X1,ABUF
	ADDM	X1,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	AOS	NSIZE
	MOVE	X1,ABUF
	ADDM	X1,NSUM
	SKIPLE	X1
	 MOVE	X1,LFCHAS
	MOVMS	X1
	DPB	X1,[270400,,LFILE+2]
	ENDR	SKIP,1

; GETDAT -- GET-RETRIEVE FILE DATA
;
GETDAT:	BEGINR	<IO,UTIL,FLAG>
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	FLAG,ABUF
	JUMPE	FLAG,GETD2
	ADDM	FLAG,NSUM
	AOS	NSIZE
	ADDM	FLAG,NSIZE
	SETZ	UTIL,
	SKIPE	FLAGFE
	 JRST	GETD3
	OUT	LFCHAN,
	 CAIA
	  THUD
GETD1:	IBP	LFOBUF+1
	HRLI	IO,(FLAG)
	CAILE	FLAG,SIZBLK
	 HRLI	IO,SIZBLK
	HRR	IO,LFOBUF+1
	CALLR	NUTFB
	MOVEI	IO,-1(FLAG)
	CAILE	FLAG,SIZBLK
	 MOVEI	IO,SIZBLK-1
	SUBI	FLAG,1(IO)
	HRRO	X1,LFOBUF+1
	ADDM	IO,LFOBUF+1
	TLC	X1,(IO)
	ADD	UTIL,(X1)
	AOBJN	X1,.-1
	OUT	LFCHAN,
	 CAIA
	  THUD
	JUMPG	FLAG,GETD1
GETD2:	ADDM	UTIL,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	IO,ABUF
	ADDM	IO,NSUM
	AOS	NSIZE
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	IO,ABUF
	ADDM	IO,NSUM
	AOS	NSIZE
	CAMN	IO,UTIL
	 JRST	GETD4
	TSOUT	<[ASCIZ/ (File Checksum Error)/],CRLF>
	JRST	GETD4
GETD3:	IN	DDCHAN,
	 JRST	GETD3
GETD4:	MSTIME	X1,
	IDIVI	X1,↑D1000
	SUBM	X1,NTIME
	ENDR

; FATAL NETWORK ERROR MESSAGES
;

NETEIT:	OUTSTR	[ASCIZ / ?? Input failure (transfer) ??/]
	JRST	QUIT
; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL:	BEGINR	<IO,BP,UTIL>
	OUT	DDCHAN,
	 CAIA
	  THUD
	MSTIME	X1,
	IDIVI	X1,↑D1000
	MOVEM	X1,NTIME
	IBP	DDOBUF+1
	HRR	BP,DDOBUF+1
	HRLI	BP,440700
	MOVE	UTIL,[440700,,FBUF]
	SCOPY	(UTIL,BP)
	MOVE	BP,UTIL
	MOVE	UTIL,[440700,,EBUF]
	SCOPY	(UTIL,BP)
	MOVE	BP,UTIL
	LDB	IO,[001400,,LFILE+2] ; CREATION DATE
	LDB	UTIL,[170300,,LFILE+1]
	LSH	UTIL,14
	IORI	IO,(UTIL)
	LDB	UTIL,[141300,,LFILE+2] ; CREATION TIME
	CALLR	LUTTNS
	DATE	IO,
	MSTIME	X1,
	IDIVI	X1,<↑D1000*↑D60>
	MOVE	UTIL,X1
	CALLR	LUTTNS
	HRLI	BP,004400
	MOVE	UTIL,VBUF
	IDPB	UTIL,BP
	CALLR	LOCS
	IDPB	IO,BP
	LDB	UTIL,[270400,,LFILE+2] ; DATA MODE
	MOVNS UTIL
	IDPB	UTIL,BP
	HRRO	X1,DDOBUF+1
	MOVEM	BP,DDOBUF+1
	SUBI BP,-1(X1)
	HRRZM	BP,NSIZE
	TLC	X1,-1(BP)
	SETZ UTIL,
	ADD	UTIL,(X1)
	AOBJN	X1,.-1
	ADDM	UTIL,NSUM
	OUT	DDCHAN,
	 CAIA
	  THUD
	ENDR

; PUTDAT -- PUT-STORE FILE DATA
;
PUTDAT:	BEGINR	<IO,UTIL>
	CALLR	LOCS
	AOS	NSIZE
	ADDM	IO,NSUM
	ADDM	IO,NSIZE
	AOS	DDOBUF+1
	MOVEM	IO,@DDOBUF+1
	OUT	DDCHAN,
	 CAIA
	  THUD
	SETZ	UTIL,
	JRST	PUTD2B

PUTD1:	ILDB	X1,LFIBUF+1
	ADD	UTIL,X1
	SOSLE	DDOBUF+2
	 JRST	PUTD2A
	MOVEM X1,X1SAVE#
	CALLR NETMSG
	 JRST PUTD3
	MOVE X1,X1SAVE#
	OUT	DDCHAN,
	 JRST	PUTD2A
	THUD
PUTD2A:	IDPB	X1,DDOBUF+1
PUTD2B:	SOSG	LFIBUF+2
	 IN	LFCHAN,
	  JRST	PUTD1
	STATO	LFCHAN,20000
	 THUD
	AOS	NSIZE
	ADDM	UTIL,NSUM
	ADDM	UTIL,NSUM
	AOS	DDOBUF+1
	MOVEM	UTIL,@DDOBUF+1
	OUT	DDCHAN,
	 CAIA
	  THUD
PUTD3:	MSTIME	X1,
	IDIVI	X1,↑D1000
	SUBM	X1,NTIME
	ENDR

; FATAL NETWORK ERROR MESSAGES
;

NETEOT:	OUTSTR	[ASCIZ / ?? Output failure (transfer) ??/]
	JRST	QUIT
; EXAFIL -- EXAMINE FILE... READ AND LIST TO TERMINAL
;
EXAFIL:	BEGINR	<IO,BP,FLAG,UTIL>
	MSTIME	X1,
	IDIVI	X1,↑D1000
	MOVEM	X1,NTIME
	MOVE	IO,[-GET$F,,FBUF]
	CALLR	NUTFB
	 RETURN
	MOVEI	IO,GET$F
	MOVEM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<FBUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[GET$E,,EBUF]
	CALLR	NUTFB
	MOVEI	IO,GET$E
	ADDM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<EBUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[GET$D,,ABUF]
	CALLR	NUTFB
	MOVEI	IO,GET$D
	ADDM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<ABUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	AOS	NSIZE
	MOVE	X1,ABUF
	ADDM	X1,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	AOS	NSIZE
	MOVE	X1,ABUF
	ADDM	X1,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	FLAG,ABUF
	JUMPE	FLAG,EXAF2
	ADDM	FLAG,NSUM
	AOS	NSIZE
	ADDM	FLAG,NSIZE
	SKIPL	DEXA$S
	 JRST	EXAF0
	MOVE	X2,[440700,,FBUF]
EXAF5:	ILDB	X1,X2
	CAILE	X1," "
	 JRST	EXAF5
	SETZ	X1,
	DPB	X1,X2
	MOVE	X2,[440700,,EBUF]
EXAF6:	ILDB	X1,X2
	CAILE	X1," "
	 JRST	EXAF6
	SETZ	X1,
	DPB	X1,X2
	TSOUT	<[ASCIZ/ [/],FBUF,[ASCIZ/./],EBUF,[ASCIZ/]/],CRLF>
EXAF0:	SETZ	UTIL,
EXAF1:	HRLI	IO,(FLAG)
	CAIL	FLAG,SIZBLK
	 HRLI	IO,SIZBLK
	HRRI	IO,EXABUF
	CALLR	NUTFB
	MOVEI	IO,(FLAG)
	CAILE	IO,SIZBLK
	 MOVEI	IO,SIZBLK
	SUBI	FLAG,(IO)
	HRLOI	X1,-1(IO)
	EQVI	X1,EXABUF
	PUSH	STAK,X1
	IMULI	IO,5
	MOVE	BP,[440700,,EXABUF]
	CALLR	DEXA$
	POP	STAK,X1
	ADD	UTIL,(X1)
	AOBJN	X1,.-1
	JUMPG	FLAG,EXAF1
EXAF2:	ADDM	UTIL,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	IO,ABUF
	ADDM	IO,NSUM
	AOS	NSIZE
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	IO,ABUF
	ADDM	IO,NSUM
	AOS	NSIZE
	CAMN	IO,UTIL
	 JRST	EXAF3
	TSOUT	<[ASCIZ/ (File Checksum Error)/],CRLF>
EXAF3:	MSTIME	X1,
	IDIVI	X1,↑D1000
	SUBM	X1,NTIME
	ENDR	SKIP,1
; ICP -- CONNECT TO DC
;
ICP:	BEGINR	<IO,UTIL,FLAG>
	PJOB X2,		; GET JOB #
	TIMER X1,		; GET A "RANDOM" VALUE
	ANDI X1,377770		; BUT INSURE ONLY A HALFWORD
	MOVSS X4,X2		; RECEIVE SOCKET
	ADDI X2,(X1)		; THIS BARFUCIOUS CROCK IS BECAUSE SAIL
	ADDI X4,(X1)		; DOESN'T ALWAYS RESET SOCKETS FAST ENOUGH
	ADDI X4,1		; TRANSMIT SOCKET
	INIT DCCHAN,17
	SIXBIT /IMP/
	0
	 JRST ICPLUZ
	SETZM CONECB
	MOVEM X2,CONECB+LSLOC
	MOVEI X3,DCHOST
	MOVEM X3,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI X3,40
	MOVEM X3,CONECB+BSLOC
	MOVEI X3,DCSOKT
	MOVEM X3,CONECB+FSLOC
	MTAPE DCCHAN,[
		↑D15
		BYTE (6) 2,24,0,12,12
		]		; TIME OUT CLS, RFNM, RFC, AND INPUT
	MTAPE DCCHAN,CONECB
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; NO CONNECTION TO LOGGER
	INPUT DCCHAN,[IOWD 1,FRS#
		0]
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; GOT LOGGER BUT DIDN'T GET SOCKET FROM HIM
	MOVE X3,FRS
	LSH X3,-4
	MOVEM X3,FRS
	ADDI X3,1
	MOVEM X3,FSS#
	ADDI X2,2
	MOVEM X2,LRS#
	ADDI X4,2
	MOVEM X4,LSS#
	MOVE X1,CONECB+LSLOC
	MOVEM X1,TERBLK+LSLOC
	MTAPE DCCHAN,TERBLK	; RELEASE LOGGER
	INIT DCCHAN,1
	SIXBIT /IMP/
	XWD DCOBUF,DCIBUF
	 JRST ICPLUZ
	MTAPE DCCHAN,[	↑D15
			BYTE (6) 5,24,0,12,0]	; TIME OUT CLS, RFNM, AND RFC
	MOVEI X1,↑D8
	DPB X1,[300600,,DCIBUF+1]
	DPB X1,[300600,,DCOBUF+1]
	MOVEM X2,CONECB+LSLOC
	MOVEI X3,DCHOST
	MOVEM X3,CONECB+HLOC
	SETZM CONECB+WFLOC
	MOVEI X3,↑D8
	MOVEM X3,CONECB+BSLOC
	MOVE X3,FSS
	MOVEM X3,CONECB+FSLOC
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TRNN X1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO RECEIVE SIDE
	CALLR CLSCHK		; SEE IF WE ARE REALLY OPEN
	 JRST ICPLUZ
	AOS CONECB+LSLOC
	SOS CONECB+FSLOC
	MOVEI X3,↑D8
	MOVEM X3,CONECB+BSLOC
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TRNN X1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO SEND SIDE
	CALLR CLSCHK
	 JRST ICPLUZ
	MOVEI X3,4
	MOVEM X3,CONECB
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TLC X1,300000
	TLCN X1,300000
	 TLNE X1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ
	SOS CONECB+LSLOC
	CALLR CLSCHK
	 JRST ICPLUZ
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TLC X1,300000
	TLCN X1,300000
	 TLNE X1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; LOST WHILE WAITING FOR RECEIVE SIDE TO CONNECT
	CALLR CLSCHK
	 JRST ICPLUZ
	RETURN

; HERE WHEN CONNECTION FAILS

ICPLUZ:	OUTSTR [ASCIZ/The Datacomputer is unavailable right now.  Try again later./]
	EXIT
	ENDR

; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	MOVEI	IO,"Z"-100
	IDPB	IO,DCOBUF+1
	OUT	DCCHAN,
	 JFCL
QUIT01:	INPUT	DCCHAN,
	STATZ	DCCHAN,20000
	 JRST	QUIT02
	SKIPE	FLAGDD
	 CALLR	NUTDD
	JRST	QUIT01
QUIT02:	RELEAS	DCCHAN,		; RELEASE INPUT/OUTPUT DEVICE
	EXIT

; CLSCHK - ROUTINE TO CHECK IF SOCKET CLOSED ON ME

CLSCHK:	BEGINR
	MTAPE DCCHAN,STTBLK
	MOVE X1,STTBLK+1
	IOR X1,STTBLK+2
	STATO DCCHAN,ERRBTS
	TLNN X1,060000
	 RETURN SKIP,1
	ENDR
; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
	OPEN DDCHAN,DDCHAS
	 JRST NETOI2
	MTAPE DDCHAN,[	15		;ALLOCATE
			1
			0
			0]
	SETZM CONECB
	MOVE X1,LRS
	ADDI X1,2
	MOVEM X1,CONECB+LSLOC
	MOVEI X1,DCHOST
	MOVEM X1,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI X1,↑D36
	MOVEM X1,CONECB+BSLOC
	MOVE X1,FSS
	ADDI X1,2
	MOVEM X1,CONECB+FSLOC
	MTAPE DDCHAN,CONECB
	STATZ DDCHAN,ERRBTS
	 JRST NETOI2
	RETURN SKIP,1
NETOI2:	OUTSTR	[ASCIZ / ?? Network connection OPEN failure ??
/]
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
	OPEN DDCHAN,DDCHAS
	 JRST NETOO2
	MTAPE DDCHAN,[	15		; ALLOCATE
			1
			0
			0]
	SETZM CONECB
	MOVE X1,LSS
	ADDI X1,2
	MOVEM X1,CONECB+LSLOC
	MOVEI X1,DCHOST
	MOVEM X1,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI X1,↑D36
	MOVEM X1,CONECB+BSLOC
	MOVE X1,FRS
	ADDI X1,2
	MOVEM X1,CONECB+FSLOC
	MTAPE DDCHAN,CONECB
	STATZ DDCHAN,ERRBTS
	 JRST NETOO2
	RETURN SKIP,1
NETOO2:	OUTSTR	[ASCIZ / ?? Network connection OPEN failure ??
/]
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
	MOVEI 3			; TERMINATE CONNECTION
	MOVEM CONECB
	SETOM CONECB+WFLOC	; WAIT FOR CLS REC'VD
	MTAPE DDCHAN,CONECB	; CLOSE IT
	RELEAS DDCHAN,
	ENDR
; NETMSG -- HANDLE PENDING MESSAGES
;
NETMSG:	BEGINR	<IO>
	SKIPE FLAGSM			; NETMSG allowed to gobble?
	 RETURN SKIP,1			; no!!
NETMS1:	MOVE	IO,DCIBUF+2		; check for cruft read but still
	CAILE	IO,20			;  not input by dftp
	 JRST	NETM1A			; stuff in buffer still
	HRRZ	IO,DCIBUF		; try another buffer
	HRRZ	IO,(IO)
	SKIPGE	(IO)
	 JRST	NETM1A
	MTAPE	DCCHAN,[10]		; try still in monitor
	 RETURN	SKIP,1
NETM1A:	DCBIN	<IO>
	CAIN	IO,"?"
	 JRST	DEATH
	CAIN	IO,"!"
	 JRST	NETMS2
	CAIE	IO,"+"
	 CAIN	IO,"-"
	  JRST	NETMS3
	CAIN IO,"."
	 JRST NETMS4
	CALLR	RENLIN
	JRST	NETMS1
NETMS2:	CALLR	RENLIP
	JRST	NETMS1
NETMS3:	CALLR	RENLIP
	RETURN
NETMS4:	SETOM FLAGSM
	CALLR RENLIN
	ENDR SKIP,1
; NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
;
NETFFI:	BEGINR
	SETO	X1,
	CAME	X1,FSBUF
	 CAMN	X1,ESBUF
	  CAIA
	   JRST	NETFI1
	TSOUT	<[ASCIZ/ (/],LUTDSF,RPAREN>
NETFI1:	SKIPN	GBUF1
	 JRST	NETFI2
	MOVE	X1,[440600,,LFILE]
	MOVEI	X2,6
	MOVE	X3,[440700,,FBUF]
NETFI4:	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,NETFI4
NETFI2:	SKIPN	GBUF2
	 RETURN
	MOVE	X1,[440600,,LFILE+1]
	MOVEI	X2,3
	MOVE	X3,[440700,,EBUF]
NETFI5:	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,NETFI5
	ENDR
; NETWORK UTILITY -- MESSAGE INPUT
;
NUTMI:	BEGINR
	IN	DCCHAN,
	 CAIA
	  JRST	NETEIT
	SKIPE	FLAGDD
	 CALLR	NUTDD
	ENDR

; NETWORK UTILITY -- MESSAGE OUTPUT
;   IN: X1 -- POINTER TO ASCIZ MESSAGE STRING
;
NUTMO:	BEGINR	<IO,BP>
	SKIPE	FLAGDD
	 OUTSTR (X1)
	MOVEI	BP,(X1)
	TLOA	BP,440700
NUTMOB:	 IDPB	IO,DCOBUF+1
	ILDB	IO,BP
	JUMPE	IO,RETN(0)
NUTMOL:	SOSL	DCOBUF+2
	 JRST	NUTMOB
NUTMOO:	OUT	DCCHAN,
	 JRST	NUTMOL
	JRST	NETEOT
	ENDR

; NETWORK UTILITY -- DISPLAY DATALANGUAGE
;
NUTDD:	BEGINR	<IO,UTIL>
	MOVE	X1,DCIBUF+1
	MOVE	UTIL,DCIBUF+2
NUTDDL:	SOJL	UTIL,RETN(0)
	ILDB	IO,X1
	JUMPE	IO,NUTDDL
	TBOUT	IO
	JRST	NUTDDL
	ENDR

; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
;   OUT: UTIL
;
NETDSI:	BEGINR
	MOVE UTIL,LRS
	ADDI UTIL,2
	ENDR

; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
;   OUT: UTIL
;
NETDSO:	BEGINR
	MOVE UTIL,LSS
	ADDI UTIL,2
	ENDR

; NETWORK UTILITY -- FILL A DESIGNATED BUFFER
;   IN: IO -- SIZE OF BUFFER (- IF EOF POSSIBLE),,ADDRESS OF BUFFER
;
NUTFB:	BEGINR
	HLRE	X1,IO
	MOVMS	X1
	HRRZI	X2,(IO)
	SKIPLE	DDIBUF+2
	 JRST	NUTFB2
NUTFB1:	IN	DDCHAN,
	 JRST	NUTFB2
	SKIPL	IO
	 THUD
	STATO	DDCHAN,020000
	 THUD
	RETURN
NUTFB2:	IBP	DDIBUF+1
	HRL	X2,DDIBUF+1
	SOS	X3,DDIBUF+2
	CAIL	X3,(X1)
	 MOVEI	X3,-1(X1)
	ADDM	X3,DDIBUF+1
	ADDI	X3,(X2)
	BLT	X2,(X3)
	SUB	X1,DDIBUF+2
	SOJLE	X1,NUTFB3
	MOVEI	X2,1(X3)
	JRST	NUTFB1
NUTFB3:	MOVNM	X1,DDIBUF+2
	SKIPL	IO
	 RETURN
	ENDR	SKIP,1
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR <IO>
	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS	; INITIALIZE LOCAL CHANNEL
	 JRST	LOCOI1
	MOVE IO,LFIPPN
	MOVEM IO,LFILE+3		; MUST CLEAR FOR SAIL PPN'S
	LOOKUP LFCHAN,LFILE	; PREPARE FILE FOR INPUT
	 JRST	LOCOI2
	INBUF LFCHAN,↑D19
	RETURN	SKIP,1
LOCOI1:	OUTSTR	[ASCIZ / ?? Local channel OPEN failure ??
/]
	RELEAS	LFCHAN,
	RETURN
LOCOI2:	OUTSTR	[ASCIZ / (Local file not found)
/]
	RELEAS	LFCHAN,
	ENDR

; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR	<IO,<IO+1>>
	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS
	 JRST	LOCOO2
	MOVE	IO,<LFILE+1>
	MOVE	<IO+1>,<LFILE+2>
	SETZM LFILE+3
	LOOKUP	LFCHAN,LFILE
	 JRST	LOCOO1
	TAIN	<[ASCIZ / [Old Local File][Confirm]/]>
	 JRST	LOCOO3
	 JRST	LOCOO3
	JRST	LOCOO1
LOCOO3:	RELEAS	LFCHAN,
	RETURN
LOCOO1:	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS	; INITIALIZE LOCAL CHANNEL
	 JRST	LOCOO2
	MOVEM	IO,<LFILE+1>
	MOVEM	<IO+1>,<LFILE+2>
	MOVE IO,LFIPPN
	MOVEM IO,LFILE+3
	ENTER LFCHAN,LFILE	; PREPARE FILE FOR OUTPUT
	 JRST	LOCOO2
	OUTBUF LFCHAN,↑D19
	RETURN	SKIP,1
LOCOO2:	OUTSTR	[ASCIZ/ (Local file creation failure)
/]
	RELEAS	LFCHAN,
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	SKIPE	FLAGFE
	 RETURN
	RELEAS	LFCHAN,
	ENDR

; LOCS -- LOCAL (FILE) SIZE
;   OUT: IO -- SIZE IN WORDS
;
LOCS:	BEGINR
	MOVS IO,LFILE+3		; - LENGTH
	MOVNS IO		; + LENGTH
	ENDR
; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI:	BEGINR	<IO>
	SETZM	GBUF1
	LDB	X1,[350700,,FBUF]
	CAIN	X1,"*"
	 SETOM	GBUF1
	SETZM	GBUF2
	LDB	X1,[350700,,EBUF]
	CAIN	X1,"*"
	 SETOM	GBUF2
	SETO	X1,
	CAME	X1,FSBUF
	 CAMN	X1,ESBUF
	  CAIA
	   JRST	LOCFI5
	SETZM	LUTDSP
LOCFI1:	CALLR	LUTDS
	 CAIA
	  JRST	LOCFI6
	OUTSTR	[ASCIZ/ (No such file)
/]
	RETURN
LOCFI6:	SETO	X1,
	CAME	X1,FSBUF
	 JRST	LOCFI2
	CAME	X1,ESBUF
	 JRST	LOCFI3
	JRST	LOCFI4
LOCFI2:	MOVE	X1,[440700,,FSBUF]
	MOVE	X2,[440700,,LUTDSF]
LOCFI7:	ILDB	X3,X1
	ILDB	X4,X2
	JUMPE	X3,LOCFI8
	CAIN	X3,(X4)
	 JRST	LOCFI7
	JRST	LOCFI1
LOCFI8:	JUMPE	X4,LOCFI4
	CAIN	X4,"."
	 JRST	LOCFI4
	JRST	LOCFI1
LOCFI3:	MOVE	X1,[440700,,ESBUF]
	MOVE	X2,[440700,,LUTDSF]
LOCFI9:	ILDB	X4,X2
	JUMPE	X4,LCFI10
	CAIE	X4,"."
	 JRST	LOCFI9
LCFI12:	ILDB	X4,X2
LCFI10:	ILDB	X3,X1
	JUMPE	X3,LCFI11
	CAIN	X3,(X4)
	 JRST	LCFI12
	JRST	LOCFI1
LCFI11:	JUMPE	X4,LOCFI4
	JRST	LOCFI1
LOCFI4:	HRRZI	IO,LUTDSF
	CALLR	LUTFN
LOCFI5:	CALLR	LOCOI
	 RETURN
	CALLR	LOCC
	ENDR	SKIP,1

; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI:	BEGINR	<IO>
	CALLR	LOCC
	SETO	X1,
	CAME	X1,FSBUF
	 CAMN	X1,ESBUF
LOCNI0:	  CALLR	LUTDS
	   RETURN SKIP,1
	SETO	X1,
	CAME	X1,FSBUF
	 JRST	LOCNI1
	CAME	X1,ESBUF
	 JRST	LOCNI2
	JRST	LOCNI3
LOCNI1:	MOVE	X1,[440700,,FSBUF]
	MOVE	X2,[440700,,LUTDSF]
LOCNI6:	ILDB	X3,X1
	ILDB	X4,X2
	JUMPE	X3,LOCNI7
	CAIN	X3,(X4)
	 JRST	LOCNI6
	JRST	LOCNI0
LOCNI7:	JUMPE	X4,LOCNI3
	CAIN	X4,"."
	 JRST	LOCNI3
	JRST	LOCNI0
LOCNI2:	MOVE	X1,[440700,,ESBUF]
	MOVE	X2,[440700,,LUTDSF]
LOCNI8:	ILDB	X4,X2
	JUMPE	X4,LCNI10
	CAIE	X4,"."
	 JRST	LOCNI8
LOCNI9:	ILDB	X4,X2
LCNI10:	ILDB	X3,X1
	JUMPE	X3,LCNI11
	CAIN	X3,(X4)
	 JRST	LOCNI9
	JRST	LOCNI0
LCNI11:	JUMPE	X4,LOCNI3
	JRST	LOCNI0
LOCNI3:	HRRZI	IO,LUTDSF
	CALLR	LUTFN
	CALLR	LOCOI
	 JRST LOCNI0
	TSOUT	<[ASCIZ/ (/],LUTDSF,RPAREN>
	SKIPN	GBUF1
	 JRST	LOCNI4
	MOVE	X1,[440600,,LFILE]
	MOVEI	X2,6
	MOVE	X3,[440700,,FBUF]
LCNI12:	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,LCNI12
LOCNI4:	SKIPN	GBUF2
	 RETURN
	MOVE	X1,[440600,,LFILE+1]
	MOVEI	X2,3
	MOVE	X3,[440700,,EBUF]
LCNI13:	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,LCNI13
	ENDR
; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO:	BEGINR	<IO>
	SETZ	X1,
	SETO	X2,
	CAMN	X2,FSBUF
	 TRO	X1,400000
	CAMN	X2,ESBUF
	 TRO	X1,200000
	JUMPE	X1,RETN(0)
	MOVE	X2,[440700,,ABUF]
	MOVE	X3,[440700,,FSBUF]
	TRNE	X1,400000
	 HRRI	X3,FBUF
	ILDB	X4,X3
	CAIN	X4," "
	 SETZ	X4,
	IDPB	X4,X2
	JUMPN	X4,.-4
	SKIPN	ESBUF
	 JRST	LOCNO0
	MOVEI	X4,"."
	DPB	X4,X2
	MOVE	X3,[440700,,ESBUF]
	TRNE	X1,200000
	 HRRI	X3,EBUF
	ILDB	X4,X3
	CAIN	X4," "
	 SETZ	X4,
	IDPB	X4,X2
	JUMPN	X4,.-4
LOCNO0:	MOVEI	IO,ABUF
	CALLR	LUTFN
	TSOUT	<[ASCIZ/ (/],ABUF,RPAREN>
	ENDR
; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IO -- POINTER TO ASCIZ STRING
;
LUTFN:	BEGINR	<IO,BP,UTIL>
	HRRI	BP,(IO)
	HRLI	BP,440700
	SETZM	LFILE		; CLEAR OLD FILE NAME
	SETZM	LFILE+1		;   AND EXTENSION
	SETZM	LFILE+2
	SETZM LFILE+3
	MOVEI	X1,LUTFNT	; INITIALIZE XCT PNTR
	MOVEI	X2,LFILE	; SET DESTINATION OF IOR
	SETZ	UTIL,
LUTFN1:	ILDB	IO,BP
	JUMPE	IO,RETN(0)
	CAIN	IO,"."	; PREPARE FOR FILE EXTENSION IF "."
	 JRST	LUTFN2
	CAILE	UTIL,5
	 JRST	LUTFN1
	ADDI	IO,40	; CONVERT TO SIXBIT BY ADDITION
	ANDI	IO,77	;   AND REMOVAL OF HIGH BITS
	XCT	(X1)		; EXECUTE THE PROPER ROTATE
	IORM	IO,(X2)	; IOR RESULT INTO FILE OR FILE+1
	AOJ	X1,		; INCREMENT THE XCT PNTR
	AOJA	UTIL,LUTFN1
LUTFN2:	CAIN	X2,LFILE+1
	 JRST	RETN(0)		; IGNORE MULTIPLE EXTENSIONS
	MOVEI	X1,LUTFNT	; RESET PNTRS FOR EXTENSION
	MOVEI	X2,LFILE+1
	MOVEI	UTIL,3
	JRST	LUTFN1
LUTFNT:	ROT	IO,-6	; HIGH ORDER
	ROT	IO,-14
	ROT	IO,22
	ROT	IO,14
	ROT	IO,6
	ROT	IO,0		; LOW ORDER
	ENDR
; LUTDS -- LOCAL UTILITY: DIRECTORY SCAN
;
LUTDS:	BEGINR
	SKIPN	LUTDSP
	 JRST	LUTDSS
LUTDS1:	JSP X1,LUTDSI
	JUMPE X2,[	JSP X1,LUTDSI
			REPEAT ↑D14,<JSP X1,LUTDSI>
			JRST LUTDS1]	; IGNORE HOLES IN DIRECTORY
	MOVE X3,[440700,,LUTDSF]
LUTDS2:	SETZ X1,
	LSHC X1,6
	ADDI X1," "
	IDPB X1,X3
	JUMPN X2,LUTDS2
	MOVEI X1,"."
	IDPB X1,X3
	JSP X1,LUTDSI
	ANDCMI X2,-1
LUTDS3:	SETZ X1,
	LSHC X1,6
	ADDI X1," "
	IDPB X1,X3
	JUMPN X2,LUTDS3
	SETZ X1,
	IDPB X1,X3
REPEAT ↑D14,<JSP X1,LUTDSI>		;IGNORE EXTRA SAIL UFD CRUFT
	RETURN	SKIP,1
LUTDSI:	SOSG LDIBUF+2
	 IN LDCHAN,
	  CAIA
	   JRST LUTDSD
	ILDB X2,LDIBUF+1
	JRST (X1)
LUTDSS:	RELEAS	LDCHAN,
	MOVE	X1,LFIPPN
	MOVEM	X1,LDIR
	MOVE	X1,LFCHAS+1
	MOVEM	X1,LDCHAS+1
	MOVE	X1,[SIXBIT/UFD/]
	MOVEM	X1,LDIR+1
	SETZM	LDIR+2
	MOVE X1,[SIXBIT/  1  1/]
	MOVEM	X1,LDIR+3
	OPEN	LDCHAN,LDCHAS
	 JRST	LUTDSE
	LOOKUP	LDCHAN,LDIR
	 JRST	LUTDSE
	SETOM LUTDSP
	JRST LUTDS1
LUTDSD:	STATO	LDCHAN,20000
LUTDSE:	 OUTSTR	[ASCIZ/ ?? Local directory failure ??
/]
	RELEAS	LDCHAN,
	ENDR
; LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
;   IN: IO -- DATE INTEGER
;	UTIL -- TIME INTEGER
;	BP -- BYTE POINTER TO DESTINATION STRING
;   OUT: BP -- UPDATED BYTE POINTER
;
LUTTNS:	BEGINR
	MOVE	X1,IO
	IDIVI	X1,↑D31
	MOVEI	X3,(X1)
	MOVEI	X1,1(X2)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	MOVEI	X1,"-"
	IDPB	X1,BP
	MOVEI	X1,(X3)
	IDIVI	X1,↑D12
	MOVEI	X3,(X1)
	HRRI	X1,LUTTM(X2)
	HRLI	X1,440700
	SCOPY	(X1,BP)
	MOVEI	X1,"-"
	IDPB	X1,BP
	MOVEI	X1,↑D64(X3)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	MOVEI	X1," "
	IDPB	X1,BP
	MOVE	X1,UTIL
	IDIVI	X1,↑D60
	MOVEI	X3,(X2)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	MOVEI	X1,":"
	IDPB	X1,BP
	MOVEI	X1,(X3)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	SETZ	X1,
	IDPB	X1,BP
	ENDR
; LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
;   IN: IO -- ADDRESS OF TIME STRING
;   OUT: IO -- DATE INTEGER
;	 UTIL -- TIME INTEGER
;
LUTTSN:	BEGINR	<BP>
	MOVE	BP,IO
	SETZ	IO,
	SETZ	UTIL,
	ILDB	X1,BP
	CAIL	X1,"0"
	 CAILE	X1,"9"
	  RETURN
	MOVEI	X4,-"0"(X1)
	IMULI	X4,↑D10
	ILDB	X1,BP
	ADDI	X4,-"0"(X1)
	ILDB	X1,BP
	CAIE	X1,"-"
	 RETURN
	MOVE	X3,[440700,,X2]
	SETZ	X2,
	ILDB	X1,BP
	IDPB	X1,X3
	ILDB	X1,BP
	IDPB	X1,X3
	ILDB	X1,BP
	IDPB	X1,X3
	MOVEI	X3,↑D11
	IOR X2,[1004,,0]	; CANONICALIZE CASES
	CAME	X2,LUTTM(X3)
	 SOJGE	X3,.-1
	JUMPL	X3,RETN(0)
	ILDB	X1,BP
	CAIE	X1,"-"
	 RETURN
	ILDB	X1,BP
	MOVEI	X2,-"0"(X1)
	IMULI	X2,↑D10
	ILDB	X1,BP
	ADDI	X2,-"0"(X1)
	SUBI	X2,↑D64
	IMULI	X2,↑D12
	ADDI	X2,(X3)
	IMULI	X2,↑D31
	ADDI	X2,-1(X4)
	ILDB	X1,BP
	CAIE	X1," "
	 RETURN
	ILDB	X1,BP
	MOVEI	X3,-"0"(X1)
	IMULI	X3,↑D10
	ILDB	X1,BP
	ADDI	X3,-"0"(X1)
	IMULI	X3,6
	ILDB	X1,BP
	CAIE	X1,":"
	 RETURN
	ILDB	X1,BP
	ADDI	X3,-"0"(X1)
	IMULI	X3,↑D10
	ILDB	X1,BP
	ADDI	X3,-"0"(X1)
	MOVE	IO,X2
	MOVE	UTIL,X3
	ENDR

; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LUTTM:	ASCII	/Jan/
	ASCII	/Feb/
	ASCII	/Mar/
	ASCII	/Apr/
	ASCII	/May/
	ASCII	/Jun/
	ASCII	/Jul/
	ASCII	/Aug/
	ASCII	/Sep/
	ASCII	/Oct/
	ASCII	/Nov/
	ASCII	/Dec/
; OOPS -- THE IMPOSSIBLE HAS HAPPENED
;
OOPS:	MOVE	IO,[IN DDCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERDD
	MOVE	IO,[OUT DDCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERDD
	MOVE	IO,[IN LFCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERLF
	MOVE	IO,[OUT LFCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERLF
	OUTSTR	[ASCIZ/ ?? Impossible event at /]
	MOVEI	IO,-1(FLAG)
	TNOUT	(IO,10)
	OUTSTR	[ASCIZ / ??/]
	EXIT
IOERDD:	GETSTS	DDCHAN,ABUF
	CAIA
IOERLF:	 GETSTS	LFCHAN,ABUF
	OUTSTR	[ASCIZ/ ?? Data error at /]
	MOVEI	IO,-3(FLAG)
	TNOUT	(IO,10)
	OUTSTR	[ASCIZ/ with status /]
	MOVE	IO,ABUF
	TNOUT	(IO,10)
	OUTSTR	[ASCIZ / ??
/]
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	JRST	QUIT
SUBTTL Data area

CRLF:	BYTE	(7)15,12,0,0,0
RPAREN:	BYTE	(7)")",15,12,0,0
SEMI:	BYTE	(7)";",15,12,0,0

	LIT			; LITERALS GO HERE

	RELOC 0

DCIBUF:	BLOCK	3
DCOBUF:	BLOCK	3
DDCHAS:	13			; BINARY
	SIXBIT	/IMP/
	DDOBUF,,DDIBUF
DDIBUF:	BLOCK	3
DDOBUF:	BLOCK	3

LFIPPN:	0			; PPN
LFILE:	0			; FILE NAME
	0			; EXTENSION AND DATES
	0			; MODE AND DATES
	0			; SIZE IN WORDS
LFCHAS:	13			; BINARY MODE
	SIXBIT	/DSK/
	LFOBUF,,LFIBUF
LFIBUF:	BLOCK	3
LFOBUF:	BLOCK	3

LDIR:	0			; PROJ-PROG OF USER
	0			; "UFD"
	0
	0			; [1,1]
LDCHAS:	13
	SIXBIT	/DSK/
	0,,LDIBUF
LDIBUF:	BLOCK	3
LUTDSP:	0
LUTDSF:	BLOCK	SBSIZE

EXABUF:	BLOCK	SIZBLK

CONECB:	BLOCK 7

; OTHER RANDOM THINGS

TERBLK:	3			; TERMINATE BLOCK
	0			; STATUS BITS
	1			; FOREIGN SOCKET LOC
	0			; DON'T WAIT

STTBLK:	2
	BLOCK 2

; * VARIABLES

CMDMOD:	0

ANCHOR:	ASCIZ	/DFTP/
	BLOCK	<SBSIZE-2>
CONTEX:	BLOCK	LBSIZE
OPENED:	BLOCK	LBSIZE
OPENEM:	0

FLAGDD:	0
FLAGDE:	0
FLAGFE:	0
FLAGNN:	0
FLAGTT:	0
FLAGSM: 0
DEXA$L:	0
DEXA$P:	0
DEXA$S:	0

; * BLOCKS

NBUF:	BLOCK	LBSIZE
FBUF:	BLOCK	SBSIZE
EBUF:	BLOCK	SBSIZE
VBUF:	0
FSBUF:	BLOCK	SBSIZE
ESBUF:	BLOCK	SBSIZE

ABUF:	BLOCK	SBSIZE
UBUF1:	BLOCK	LBSIZE
UBUF2:	BLOCK	SBSIZE
GBUF1:	BLOCK	LBSIZE
GBUF2:	BLOCK	LBSIZE

NTIME:	0
NSIZE:	0
NSUM:	0

TCIPCL:	BLOCK	100		; P(OSSIBLE)C(OMMAND)L(IST) [INIT ALL]
TCIPLP:	0			; TCIPCL PTRS (# POSSIBLITIES,,LIST ADR)
	BLOCK	37		;   (SIZE = # CHARS IN LARGEST CMD)
TCIPNF:	0			; P(OSSIBLE)N(EXT)F(REE)

	STSIZ==100
STBEG:	BLOCK	STSIZ

	VAR

	-1			; CRETINOUS LINK-10 BUG

	END	DFTP